2011-07-19 11 views
9

con el siguiente comandoadvertencia GCC: ISO C no permite nombrados macros variadic

gcc -c -Wall -Wextra -pedantic -ansi -std=c99 -fstack-protector-all -fstack-check -O3 root.c -o rootTESTOBJECT 

consigo el compilador de advertencia Root.h: 76: 22: advertencia: ISO C no permite nombrados macros variadic

72 #ifdef Debug 
73 #include <stdio.h> 
74 #define crumb(phrase0...) printf(phrase0) 
75 #else 
76 #define crumb(phrase0...) 
77 #endif 

creo que la opción -ansi -std = c99 permite el uso de macros variadic, lo hace de acuerdo a la documentación de todos modos ...

He tratado línea de la edición del 76 al

76 #define crumb(phrase0...) printf("") 

para ver si se ha arreglado la advertencia, pero sin alegría.

el compilador de verion es gcc de Apple, versión 4.2.1 No estoy seguro si necesito estar demasiado preocupado por esto, pero realmente no me gustan las advertencias. ¿Qué bandera me estoy perdiendo?

Respuesta

18

#define crumb(phrase0...) <whatever> está dando un nombre (phrase0) a los argumentos variables (...).

Esto es GCC extension.

C99 sí define un modo de paso de argumentos variables para macros (ver §6.10.3/12 y §6.10.3.1/2): los argumentos variables son sin nombre en el lado izquierdo de las definiciones (es decir, justo ...), y se hace referencia en el lado derecho como __VA_ARGS__, así:

#define crumb(...) printf(__VA_ARGS__) 

(Por cierto, sus gcc argumentos no deben incluir tanto -ansi y -std=c99: -ansi especifica el estándar de C anterior (conocido también como ANSI C, C89 o C90); la combinación de ambas opciones solo ocurre t o seleccione C99 en este caso porque -std=c99 aparece después de-ansi en la lista de argumentos, y el último gana.)

+0

gracias, eso lo arregló – lbdl

Cuestiones relacionadas