宏调用函数

MD *_* XF 3 c macros preprocessor arguments c-preprocessor

我需要一个宏(或一个函数,但最好是一个宏),它接受一个函数名和无限数量的参数,然后将参数传递给函数.让我们说这个宏是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)
}
Run Code Online (Sandbox Code Playgroud)

我怎么能定义这样一个宏?我想过做的事情:

#define MACROFOO(function, args...)     (function)(args)
Run Code Online (Sandbox Code Playgroud)

但它看起来像传递...给函数,而不是实际的参数.我该怎么办?

PSk*_*cik 7

您可以使用扩展...可变参数宏__VA_ARGS__.

例:

#define MACROFOO(function, ...)  (function)(__VA_ARGS__)

MACROFOO(printf, "hello world%c", '!') 
/*^ expands to: (printf)("hello world%c", '!') */
Run Code Online (Sandbox Code Playgroud)

注意:您可能知道,括号会阻止function参数作为宏扩展(如果它是宏).

也就是说,

#define BAR(...) myprintf(__VA_ARGS__)
MACROFOO(BAR, "hello world%c", '!')
Run Code Online (Sandbox Code Playgroud)

将扩展到:

(BAR)("hello world%c", '!')
Run Code Online (Sandbox Code Playgroud)

用括号和

myprintf("hello world%c", '!')
Run Code Online (Sandbox Code Playgroud)

如果你删除它们.


Men*_*ックス 5

您可以使用标准变量参数__VA_ARGS__:

#define MACROFOO(function, ...)  (function)(__VA_ARGS__)
Run Code Online (Sandbox Code Playgroud)

或者如果您喜欢更具描述性的名称,可以在之前写一个名称来使用此GNU CPP扩展名...:

#define MACROFOO(function, parameters...)  (function)(parameters)
Run Code Online (Sandbox Code Playgroud)

GNU CPP第3.6节:

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

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