我想用C编写一个宏,它接受任意数量的参数,而不是特定数量的参数示例:
#define macro( X ) something_complicated( whatever( X ) )
其中X是任意数量的参数我需要这个,因为whatever是重载的,可以用2或4个参数调用。我试着定义宏两次,但是第二次定义覆盖了第一次定义!我使用的编译器是g ++(更确切地说,是mingw)
X
whatever
vngu2lb81#
C99方式,也支持VC++编译。
#define FOO(fmt, ...) printf(fmt, ##__VA_ARGS__)
35g0bw712#
__VA_ARGS__是标准的方法,如果没有必要,不要使用编译器特有的技巧。不能评论原帖真的很恼火,反正C不是C的超集,用C编译器编译你的C代码真的很傻,Donny不做的事情就不要做了。
__VA_ARGS__
kknvjkwl3#
我不认为这是可能的,你可以用双括号来伪造它......只要你不需要单独的参数。
#define macro(ARGS) some_complicated (whatever ARGS) // ... macro((a, b, c)) macro((d, e))
eoigrqb64#
#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
第一个注解掉PRINT指令,第二个阻止PRINT指令,因为如果条件为NULL。如果设置了优化,编译器应删除从未执行过的指令,如:如果(0)打印(“你好世界”);或((空)0);
8gsdolmq5#
这里解释了g++,尽管它是C99的一部分,所以应该对每个人都有效http://www.delorie.com/gnu/docs/gcc/gcc_44.html快速示例:
#define debug(format, args...) fprintf (stderr, format, args)
gdrx4gfi6#
·变量数目用省略号(...)表示·ISO C的语法要求在'...'之前至少有一个固定参数例如,您可以键入:
#define DEBUGMSG ( int, ...)
6条答案
按热度按时间vngu2lb81#
C99方式,也支持VC++编译。
35g0bw712#
__VA_ARGS__
是标准的方法,如果没有必要,不要使用编译器特有的技巧。不能评论原帖真的很恼火,反正C不是C的超集,用C编译器编译你的C代码真的很傻,Donny不做的事情就不要做了。
kknvjkwl3#
我不认为这是可能的,你可以用双括号来伪造它......只要你不需要单独的参数。
eoigrqb64#
如果编译器不理解可变参数宏,还可以使用以下任一方法去除PRINT:
或
第一个注解掉PRINT指令,第二个阻止PRINT指令,因为如果条件为NULL。如果设置了优化,编译器应删除从未执行过的指令,如:如果(0)打印(“你好世界”);或((空)0);
8gsdolmq5#
这里解释了g++,尽管它是C99的一部分,所以应该对每个人都有效
http://www.delorie.com/gnu/docs/gcc/gcc_44.html
快速示例:
gdrx4gfi6#
·变量数目用省略号(...)表示·ISO C的语法要求在'...'之前至少有一个固定参数
例如,您可以键入: