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

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

我想弄清楚如何编写一个 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);

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

C 预处理器允许您一起使用 ## 到 "glue" 标记。

这意味着

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

会变成

foo_postfix

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

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.

的值