如何编写一个宏,将文本附加到部分函数名称以创建完整的函数名称

Pho*_*non 1 c c++ macros

我试图弄清楚如何编写一个 C 预处理器宏,该宏可以接受部分函数名称和一段文本以附加到函数名称以及一组参数以创建实际的函数名称和函数调用。这个想法是组合前两个宏参数来创建一个函数名,然后添加其余的宏参数作为创建的函数名的参数。

所以我想实现以下目标:

MACRO(foo, postfix, ...)
----> foo_postfix(__VA_ARGS__)
Run Code Online (Sandbox Code Playgroud)

举例来说,如果我有几个C函数,func_test1()func_test2()func_test3()那我希望能够使用宏来指定func为第一个参数,test1作为第二个参数,以便宏将创建一个函数名func_test1(),或指定func为第一个参数并test2作为第二个参数,以便宏将创建一个函数名称func_test2.

或类似的东西

#define MACRO(foo,postfix,...)  "macro to combine foo and postfix into actual function name"
Run Code Online (Sandbox Code Playgroud)

然后我可以像这样使用这个宏

MACRO(func, test1, a, b, c);  // will create func_test1(a, b, c);
MACRO(func, test2, i, x);     // will create func_test2(i, x);
Run Code Online (Sandbox Code Playgroud)

似乎没有一种直接的方法可以做到这一点。

pha*_*tom 5

您可以##在宏中使用将两个参数连接为字符串。所以如果你的宏是

MACRO(foo, postfix, ...)
Run Code Online (Sandbox Code Playgroud)

你可以这样定义

MACRO(foo, postfix, ...) foo##_##postfix(__VA_ARGS__)
                              ^^^ adds an underscore in the middle. Don't include if you
                                 don't want the underscore.
Run Code Online (Sandbox Code Playgroud)

连接foopostfix在两者之间使用下划线。

将作为宏的参数与这些类型的宏一起使用时要小心。参数被粘贴而不进行宏扩展,因此这样做MACRO(foo, MYMACRO, ~)将扩展到foo_MYMACRO()而不是 的值MYMACRO

  • 在检查外部宏是否进行替换之前,将连接标记。为了做你想做的事,你必须使用多个级别的宏。有关示例,请参阅[此处](http://coliru.stacked-crooked.com/a/5d8dd00f9e278e09)。 (2认同)