宏调用函数

我需要一个宏(或一个函数,但最好是一个宏),它接受一个函数名和无限数量的参数,然后将参数传递给函数。 我们假设这个宏是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__扩展可变参数宏的__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) 

GNU CPP第3.6节:

(…) Variadic宏是C99中的新function 。 GNU CPP已经支持了很长时间,但只有一个命名变量参数(’args …’,而不是’…’和__VA_ARGS__)。

如果您担心以前版本的GCC的可移植性,则应仅使用命名变量参数。 另一方面,如果您关注其他符合C99实现的可移植性,则应仅使用__VA_ARGS__。