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

how to write a macro that will append text to a partial function name to create complete function name

本文关键字:函数 创建 文本 何编写      更新时间:2023-10-16

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

所以我想实现以下内容:

MACRO(foo, postfix, ...)
----> foo_postfix(__VA_ARGS__)

例如,如果我有几个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"

然后我可以使用这个宏,例如

MACRO(func, test1, a, b, c);  // will create func_test1(a, b, c);
MACRO(func, test2, i, x);     // will create func_test2(i, x);

似乎没有一种直接的方法。

您可以在宏中使用 ##将两个参数作为字符串连接。因此,如果您的宏为

MACRO(foo, postfix, ...)

您可以像这样定义

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

与下划线的foopostfix融合。

使用这些类型的宏的参数时要小心。该参数粘贴而没有进行宏扩展,因此进行MACRO(foo, MYMACRO, ~)将扩展到foo_MYMACRO(),而不是MYMACRO的值。

C预处理器允许您使用##将"胶"令牌一起使用。

这意味着

#define MACRO(x, y) x ## _ ## y
MACRO(foo, postfix)

将变成

foo_postfix