style guide coding c++ c-preprocessor variadic-macros

c++ - guide - ¿Las macros variables no son estándar?



c style guide (4)

A partir de C ++ 11, las macros variadas se incluyen ahora en C ++ estándar. 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í hay un ejemplo de una definición de macro variadica conformes al estándar en C ++:

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

Para los depuradores, usualmente utilizo Clang, ya que formatea mejor las advertencias y los errores, y hace que sea más fácil rastrearlos y solucionarlos.

Pero recientemente, después de agregar una macro con argumentos variados, Clang me contó lo siguiente (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, incluidos Visualstudio, Sunstudio y, por supuesto, GCC. Pero solo para asegurarme de que Clang es correcto, probé otras dos formas de expandir los argumentos variadic:

Numero 1:

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

Número 2:

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

En ambos recibo este mensaje:

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

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


Cita Wikipedia :

Las macros de argumento variable se introdujeron en 1999 en la revisión de la norma C / ISO / IEC 9899: 1999 (1999), y en 2011 en la revisión de la norma sobre lenguaje C + + ISO / IEC 14882: 2011 (C ++ 11).

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


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 al cumplimiento de C99. Así que entre eso y GCC hay algunas razones para evitar usarlos. Incluso en la mayoría de los compiladores de sistemas embebidos los uso, son compatibles.

Sin embargo, evite el formulario "Número 1", que es firmemente específico de GCC y, sin duda, está en desuso.


Estándar dice en 16.3 reemplazo de macros :

El identificador _ _ VA_ARGS _ _ solo aparecerá en la lista de reemplazo de una macro similar a una función que utiliza la notación de puntos suspensivos en los parámetros.