2011-01-24 12 views
29

Para los depuradores, usualmente utilizo Clang, ya que formatea mejor las advertencias y los errores, y hace que sea un poco más fácil rastrearlos y solucionarlos.¿Las macros variables no son estándar?

Pero recientemente después de la adición de una macro con argumentos variadic, Clang me dijo lo siguiente (a partir de un proyecto ficticio):

main.cpp:5:20: warning: named variadic macros are a GNU extension [-Wvariadic-macros] 
#define stuff3(args...) stuff_i(args) 

sé que macroname(args...) compila bien en una amplia gama de compiladores, incluyendo VisualStudio, SunStudio y, por supuesto, GCC. Pero sólo para asegurarse de que sonido metálico que es correcto, he intentado otras dos formas de ampliar los argumentos variadic:

Número 1:

#define stuff1(...) stuff_i(...) 

Número 2:

#define stuff2(...) stuff_i(__VA_ARGS__) 

A ambos recibo este mensaje:

main.cpp:3:16: warning: variadic macros were introduced in C99 [-Wvariadic-macros] 

... ¿Qué hace que me pregunte si macros variadic son en realidad parte del estándar de C++ (una nd, por supuesto, sé que el preprocesador se interpreta de forma independiente)?

+1

C99 y C++ 0x apoyan oficialmente la versión 2. C++ 03 no admite ninguna macro variadic.La versión 1 es una extensión específica de GCC – sellibitze

+0

(como su nombre) cuando compila con GCC existe la opción '-pedantic' que debe informar de las extensiones utilizadas. Como la matriz de longitud variable o las macros variadas, por ejemplo. En GCC se incluyen simplemente porque como son parte de C99, la lógica ya está implementada, por lo que debe haber parecido una buena idea dejar que el beneficio popular de C++ :) –

+0

@Matthieu M: Sí, de hecho, también pensé que esta característica sería parte de C++, ya que es parte de C99 ... curiosamente, gcc no dice que las macros variadic denominadas son de hecho una extensión de GNU, sino que simplemente dice que no son parte del estándar: 'warning: ISO C no permite macros variadas con nombre' –

Respuesta

36

Cita Wikipedia:

macros variable de argumentos se introdujeron en 1999 en el 9899 ISO/IEC: 1999 revisión (C99) de la norma lenguaje C, y en 2011 en la norma ISO/IEC 14882: 2011 (C++ 11) revisión del estándar de lenguaje C++.

Así que es estándar de C99 y C++ 11 en adelante, pero una extensión de GNU en C++ 03.

4

En la forma de su ejemplo "Número 2", son estándar en C99, y generalmente un preprocesador del compilador de C++ es el mismo para la compilación C y C++.

También son compatibles con Microsoft VC++ a pesar de su resistencia obstinada a cumplir C99. Entonces, entre eso y GCC hay pocas razones para evitar usarlos. Incluso en la mayoría de los compiladores de sistemas integrados que uso son compatibles.

Sin embargo, evite la forma "Número 1", que es firmemente específica de GCC, y sin duda desaprobada.

0

estándar dice en reemplazo 16,3 Macro:

El identificador _ _ VA_ARGS _ _ se producirá sólo en la sustitución-lista de una macro-función como que utiliza la notación puntos suspensivos en los parámetros.

26

A partir de C++ 11, las macros variadas se incluyen ahora en el estándar C++. La sección 16.3 del estándar C++ 11 especifica macros variadas tales que son compatibles con macros variadas de C99 (la segunda forma en la pregunta).

Aquí es un ejemplo de una definición de macro variadic que sigan los estándares en C++:

#define foo(x, y, ...) bar(x, y, __VA_ARGS__) 
+1

Es conforme conforme a las normas, pero también adolece del error de coma, si se quiere creer en Wikipedia. –

+0

@AlexeiAverchenko: He visto en la documentación de gcc que la coma se eliminará si no se coloca nada en ... sin embargo hoy porto un código para sonar y obtengo un error de 'expresión esperada 'y aún no he terminado entendiéndolo puede estar relacionado –

Cuestiones relacionadas