2011-04-21 17 views
6

Estoy trabajando con un primitivo C analizador que no maneja la directiva Preprocessor.C Preprocesador deshacerse de __align__ y __tributo__

Puedo preprocesar la mayor parte del encabezado con el interruptor -E sin problema.

Últimamente me encontraron casos cuando atributo y align están presentes.

Me trataron de deshacerse de ellos con este truco:

gcc -D "aligned(ARGS)" \ 
    -D "__align__(ARGS)" \ 
    -D "__attribute__(ARGS)" \ 
    -E /usr/local/include/fancyheader.h 

Actualización:

pero sin éxito, ejemplo:

struct __attribute__((aligned(16))) long4 
{ 
    long int x, y, z, w; 
}; 

Las declaraciones anteriores se transforma en, con ese "1" pendiente alrededor de

struct 1 long4 
{ 
    long int x, y, z, w; 
}; 

¿Quién sabe la forma correcta de deshacerse de las extensiones __align__ y __attribute__?

+2

Está bien, ¿qué es este analizador primitivo de C, y qué intenta hacer con él? ¿Qué pasó cuando intentó deshacerse de esas cosas con la directiva -D? Simplemente "sin éxito" no nos dice nada. –

+0

¿Qué sucede si especifica 'gcc -xc -D ....'? –

Respuesta

10

¿Qué ocurre cuando usa -D "aligned(ARGS)="?

+0

Eso funciona para mí. Excepto que necesita eliminar eso comillas. – TonyK

+0

Eso funcionó. Pero ¿por qué la necesidad de =? – fabrizioM

+3

Por defecto (si no hay '='), la opción -D define la macro como la expansión a '1' –

0

¿Qué le parece des-definir todas las macros predefinidas y las integradas con la opción -U, y luego crear nuevas definiciones con la opción -D?

+0

Aparece el siguiente error: : error: los nombres de las macros deben ser identificadores – fabrizioM

3

El preprocesador asigna el valor 1 a todas las macros definidas en la línea de comandos sin especificar una lista de reemplazo. Por ejemplo, si se compila con -DFOO:

std::cout << FOO << std::endl; 

imprimirá 1. Si desea configurar explícitamente la lista de sustitución de macros para que esté vacía, utilice -DFOO= (o en su caso -D__align__(x)=.