Cómo definir una función de macro que no admite parámetros de entrada y también admite parámetros de entrada al mismo tiempo

Quiero definir una función de macro que soporte al mismo tiempo:

1) Sin parámetro de entrada

2) Parámetros de entrada

algo como eso:

#define MACRO_TEST(X)\ printf("this is a test\n");\ printf("%d\n",x) // the last printf should not executed if there is no input parameter when calling the macro 

En general:

 int main() { MACRO_TEST(); // This should display only the first printf in the macro MACRO_TEST(5); // This should display both printf in the macro } 

Puedes usar sizeof para este propósito.

Considera algo como esto:

 #define MACRO_TEST(X) { \ int args[] = {X}; \ printf("this is a test\n");\ if(sizeof(args) > 0) \ printf("%d\n",*args); \ } 

gcc y las versiones recientes de comstackdores de MS admiten macros variadic, que son macros que funcionan de manera similar a printf.

La documentación de gcc aquí: http://gcc.gnu.org/onlinedocs/gcc/Variadic-Macros.html

La documentación de Microsoft aquí: http://msdn.microsoft.com/en-us/library/ms177415(v=vs.80).aspx

No exactamente eso, pero …

 #include  #define MTEST_ #define MTEST__(x) printf("%d\n",x) #define MACRO_TEST(x)\ printf("this is a test\n");\ MTEST_##x int main(void) { MACRO_TEST(); MACRO_TEST(_(5)); return 0; } 

EDITAR

Y si 0 puede ser usado como salto:

 #include  #define MACRO_TEST(x) \ do { \ printf("this is a test\n"); \ if (x +0) printf("%d\n", x +0); \ } while(0) int main(void) { MACRO_TEST(); MACRO_TEST(5); return 0; } 

El estándar C99 dice:

Un identificador actualmente definido como una macro similar a un objeto no será redefinido por otra directiva #define reprocessing a menos que la segunda definición sea una definición de macro similar a un objeto y las dos listas de reemplazo sean idénticas. Del mismo modo, un identificador actualmente definido como una macro similar a una función no será redefinido por otra directiva #define preprocesamiento a menos que la segunda definición sea una definición de macro similar a una función que tenga el mismo número y ortografía de parámetros, y las dos listas de reemplazo sean idénticas .

Creo que el comstackdor muestra una advertencia de MACRO redefinido. Por lo tanto no es posible.