Alternativa estándar al truco ## __ VA_ARGS__ de GCC?

Hay unbien conocid problem con argumentos vacíos para macros variadic en C99.

ejemplo

#define FOO(...)       printf(__VA_ARGS__)
#define BAR(fmt, ...)  printf(fmt, __VA_ARGS__)

FOO("this works fine");
BAR("this breaks!");

El uso deBAR() anterior es de hecho incorrecto según el estándar C99, ya que se expandirá a:

printf("this breaks!",);

Note la coma final - no funciona.

Algunos compiladores (por ejemplo: Visual Studio 2010) eliminarán silenciosamente esa coma final por usted. Otros compiladores (p. Ej .: GCC) admiten put## en frente de__VA_ARGS__, al igual que

#define BAR(fmt, ...)  printf(fmt, ##__VA_ARGS__)

Pero, ¿hay alguna forma que cumpla con los estándares para obtener este comportamiento? ¿Quizás usando múltiples macros?

Ahora mismo, el## versión parece bastante bien soportada (al menos en mis plataformas), pero realmente prefiero usar una solución que cumpla con los estándares.

Preventivo: Sé que podría escribir una pequeña función. Estoy tratando de hacer esto usando macros.

Edita: Aquí hay un ejemplo (aunque simple) de por qué me gustaría usar BAR ():

#define BAR(fmt, ...)  printf(fmt "\n", ##__VA_ARGS__)

BAR("here is a log message");
BAR("here is a log message with a param: %d", 42);

Esto agrega automáticamente una nueva línea a mis declaraciones de registro BAR (), suponiendo quefmt siempre es una cadena en C con comillas dobles. NO imprime la nueva línea como un printf () separado, lo cual es ventajoso si el registro está almacenado en línea y proviene de múltiples fuentes de forma asincrónica.

Respuestas a la pregunta(10)

Su respuesta a la pregunta