我需要一个宏(或函数,但最好是宏),它接受函数名和无限数量的参数,然后将参数传递给函数。假设这个宏是MACROFOO
。
#define MACROFOO(function, ...) /* what do I put here?? */
int foo_bar(int x, int y)
{
// do stuff
}
int main(void)
{
int x = 3;
int y = 5;
MACROFOO(foo_bar, x, y); // calls foo_bar(x, y)
}
我怎么定义这样的宏呢?我想做一些类似这样的事情:
#define MACROFOO(function, args...) (function)(args)
但它看起来像是将...
传递给函数,而不是实际的参数。我该怎么办?
发布于 2017-03-07 17:56:07
您可以使用__VA_ARGS__
扩展各种宏的...
。
示例:
#define MACROFOO(function, ...) (function)(__VA_ARGS__)
MACROFOO(printf, "hello world%c", '!')
/*^ expands to: (printf)("hello world%c", '!') */
注意:您可能知道,圆括号阻止function
参数作为宏展开(如果它是宏)。
也就是说,
#define BAR(...) myprintf(__VA_ARGS__)
MACROFOO(BAR, "hello world%c", '!')
将扩展到:
(BAR)("hello world%c", '!')
使用括号和
myprintf("hello world%c", '!')
如果您删除了它们。
发布于 2017-03-07 18:09:02
您可以使用标准变量参数__VA_ARGS__
#define MACROFOO(function, ...) (function)(__VA_ARGS__)
或者,如果您想要一个更具描述性的名称,您可以通过在...
前面写一个名称来使用这个GNU CPP扩展:
#define MACROFOO(function, parameters...) (function)(parameters)
(...) 变量宏是C99中的一项新功能。GNU CPP支持它们已经有很长一段时间了,但只支持一个命名的变量参数(‘args...’,而不是‘...’和__VA_ARGS__)。
如果您考虑到以前版本的GCC的可移植性,则应该仅使用命名变量参数。另一方面,如果您关心到其他符合C99规范的实现的可移植性,则应该只使用__VA_ARGS__.
https://stackoverflow.com/questions/42654888
复制