我需要一个宏(或一个函数,但最好是一个宏),它接受一个函数名和无限数量的参数,然后将参数传递给函数。让我们说这个宏是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)
但它看起来像是将...
传递给函数,而不是实际的参数。我该怎么办?
您可以使用...
扩展可变参数宏的__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", '!')
如果你删除它们。
您可以使用标准变量参数__VA_ARGS__
:
#define MACROFOO(function, ...) (function)(__VA_ARGS__)
或者如果您喜欢更具描述性的名称,可以在...
之前写一个名称来使用此GNU CPP扩展:
#define MACROFOO(function, parameters...) (function)(parameters)
(...)Variadic宏是C99的新功能。 GNU CPP已经支持了很长时间,但只有一个命名变量参数('args ...',而不是'...'和__VA_ARGS__)。
如果您担心以前版本的GCC的可移植性,则应仅使用命名变量参数。另一方面,如果您关心其他符合C99实现的可移植性,则应仅使用__VA_ARGS__。