如何使一个可变参数宏(可变的参数个数)
-
22-08-2019 - |
题
欲写在C宏接受任何数量的参数,而不是特定数目
示例:
#define macro( X ) something_complicated( whatever( X ) )
其中X
是任何数量的参数
我需要这个因为whatever
过载,并且可以具有2个或4个参数来调用。
我试图限定两次宏,但第二个定义覆盖了第一个!
我正在使用该编译器为g ++(更具体地,MinGW的)
解决方案
C99方式,也由C ++编译器的支持。
#define FOO(fmt, ...) printf(fmt, ##__VA_ARGS__)
其他提示
__VA_ARGS__
是做到这一点的标准方式。不要使用编译器特定的黑客,如果你不就得了。
我真的很生气,我不能在原帖评论。在任何情况下,C ++不是C的超集,这实在是愚蠢与C ++编译器编译C代码。不要做什么唐尼不要做。
我不认为这是可能的,你可以用双括号假的...只是,只要你不单独需要的参数。
#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;
}
如果编译器不理解可变参数宏,也可以去掉PRINT与以下任一操作:
#define PRINT //
或
#define PRINT if(0)print
在第一评论出打印指令,所述第二阻止,因为如果条件为NULL的打印指令。如果优化设置,编译器应该去掉从未执行的指令,如:IF(0)打印(“世界你好”);或((无效)0);
下g ++这里所解释的,尽管它是C99的一部分,因此应该为每个人的工作
http://www.delorie.com/gnu/docs/gcc /gcc_44.html
快速示例:
#define debug(format, args...) fprintf (stderr, format, args)
不隶属于 StackOverflow