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.