2011-08-28 32 views
5

¿Es posible emitir una instrucción #define insensible a mayúsculas y minúsculas con el preprocesador?Insensible a mayúsculas/minúsculas #define

Por ejemplo, quiero convertir cualquier carcasa de foobar a spameggs, es decir:

FooBar -> spameggs 
foobar -> spameggs 
fooBar -> spameggs 
Foobar -> spameggs 
FOOBAR -> spameggs 
FOOBAr -> spameggs (an odd possibility I know) 
etc 

La razón detrás de esto es que quiero #define algunas subrutinas FORTRAN tener diferentes nombres, y por supuesto son insensibles a mayúsculas y minúsculas Tenga en cuenta que realmente no me importa preservar el esquema de capitalización (que en el último ejemplo parece un poco absurdo).

+0

etiqueta eliminada - esta pregunta no tiene nada que ver con el lenguaje [FORTRAN]. – Rook

Respuesta

4

Desgraciadamente, como saben, los identificadores C distinguen entre mayúsculas y minúsculas. Por lo tanto, también lo son los símbolos del preprocesador (si uno fuera sensible a mayúsculas y el otro no, podría obtener comportamientos muy extraños cuando intentara modificar solo uno de los símbolos con el preprocesador). No hay un indicador de sustitución para este comportamiento ni una construcción alternativa define (al menos que conozco en los front-ends del compilador GCC para C/++).

La solución más obvia será grep su código para foobar, estuche insensible. Utilizar los resultados para construir una tabla de todas las posibles carcasas foobar y, o bien

  1. todos ellos correctos para una carcasa consistente
  2. Crear un archivo de pre-procesador único que hace las redefiniciones para todos los casos.

En la solución más adelante, no es necesario que contaminan un código legible por humanos con esto - simplemente máquina de generar un archivo FixFooBar.h completa de estas modificaciones del mapa, e incluirla en caso necesario.

+0

Bastante molesto, pero algo de lo que esperaba. Había pensado en las soluciones 1 y 2, solo esperaba no tener que usarlas ya que se sienten hacky. – VolatileStorm

-1

¿Ha intentado utilizar el comando de entrada:

subroutine name1 (args) 
    entry  name2 (args) 
    entry  name3 (args) 
    .... 
    return 
    end 
+1

Esta es una pregunta en C++. –

Cuestiones relacionadas