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

时间:2015-05-08 00:38:17

标签: c++ c macros

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

所以我想实现以下目标:

func_test1()

例如,如果我有几个C函数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);

然后我可以像

一样使用这个宏
def FitFunc(self, x, y, Center, Amp, FWHM):

这似乎并不是一种直截了当的方法。

2 个答案:

答案 0 :(得分:4)

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

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的值。

答案 1 :(得分:0)

C预处理器允许您使用##来粘合"代币一起。

这意味着

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

将变为

foo_postfix