如何使可变macros(可变数量的参数)

我想用C写一个接受任意数量参数的macros,而不是一个特定的数字

例:

#define macro( X ) something_complicated( whatever( X ) ) 

其中X是任意数量的参数

我需要这个,因为whatever是超载,可以调用2或4参数。

我试过两次定义这个macros,但是第二个定义覆盖了第一个macros!

我正在使用的编译器是g ++(更具体地说,mingw)

C99的方式,也支持VC ++编译器。

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

__VA_ARGS__是执行此操作的标准方法。 如果你不需要,不要使用编译器特定的黑客。

我真的很恼火,我不能评论原帖。 在任何情况下,C ++都不是C的超集。用C ++编译器编译C代码是非常愚蠢的。 不要做唐尼不要做的事情。

我不认为这是可能的,你可以用双parens伪造…只要你不需要单独的论据。

 #define macro(ARGS) some_complicated (whatever ARGS) // ... macro((a,b,c)) macro((d,e)) 
 #define DEBUG #ifdef DEBUG #define PRINT print #else #define PRINT(...) ((void)0) //strip out PRINT instructions from code #endif void print(const char *fmt, ...) { va_list args; va_start(args, fmt); vsprintf(str, fmt, args); va_end(args); printf("%s\n", str); } int main() { PRINT("[%s %d, %d] Hello World", "March", 26, 2009); return 0; } 

如果编译器不理解可变macros,则也可以使用以下任一方法去除PRINT:

 #define PRINT // 

要么

 #define PRINT if(0)print 

第一个注释掉PRINT指令,第二个防止PRINT指令,因为条件为NULL。 如果优化设置,编译器应该去掉从未执行的指令,如:(0)print(“hello world”); 或((void)0);

在这里解释了g +​​+,虽然它是C99的一部分,所以应该为大家工作

http://www.delorie.com/gnu/docs/gcc/gcc_44.html

快速示例:

 #define debug(format, args...) fprintf (stderr, format, args)