has*_*sen 182 c g++ variadic c-preprocessor
我想在C中编写一个宏,它接受任意数量的参数,而不是特定的数字
例:
#define macro( X ) something_complicated( whatever( X ) )
Run Code Online (Sandbox Code Playgroud)
哪里X有任何数量的参数
我需要这个,因为它whatever是重载的,可以用2或4个参数调用.
我试过两次定义宏,但第二个定义覆盖了第一个!
我正在使用的编译器是g ++(更具体地说,mingw)
Ale*_*x B 283
C99方式,也由VC++编译器支持.
#define FOO(fmt, ...) printf(fmt, ##__VA_ARGS__)
Run Code Online (Sandbox Code Playgroud)
cmc*_*abe 34
__VA_ARGS__是标准的方法.如果您不需要,请不要使用特定于编译器的黑客攻击.
我真的很生气,我无法对原帖发表评论.在任何情况下,C++都不是C的超集.使用C++编译器编译C代码真的很愚蠢.不要做Donny不做的事.
edu*_*ffy 25
我不认为这是可能的,你可以用双parens伪造它...只要你不需要单独的参数.
#define macro(ARGS) some_complicated (whatever ARGS)
// ...
macro((a,b,c))
macro((d,e))
Run Code Online (Sandbox Code Playgroud)
小智 10
#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;
}
Run Code Online (Sandbox Code Playgroud)
如果编译器不了解可变参数宏,您还可以使用以下任一方法去掉PRINT:
#define PRINT //
Run Code Online (Sandbox Code Playgroud)
要么
#define PRINT if(0)print
Run Code Online (Sandbox Code Playgroud)
第一个注释掉PRINT指令,第二个注释因为条件为NULL而阻止PRINT指令.如果设置了优化,编译器应该删除从未执行过的指令,如:if(0)print("hello world"); 或((无效)0);
在这里解释了 g++,虽然它是 C99 的一部分,所以应该对每个人都适用
http://www.delorie.com/gnu/docs/gcc/gcc_44.html
快速示例:
#define debug(format, args...) fprintf (stderr, format, args)
Run Code Online (Sandbox Code Playgroud)