C预处理器定义生成的函数名称
我有一种情况,我有很多生成的函数,并希望将它们指向我创建的一些通用函数(允许我在生成的函数名称更改时重用基本代码)。
基本上,我有一个函数名列表如下:
void Callback_SignalName1(void); void Callback_SignalName2(void); ...etc
一旦生成了这些,我想定义一个宏来允许它们被一般地调用。 我的想法是这样,但我没有任何运气实现它…因为C预处理器采用宏的名称而不是宏定义为:
#define SIGNAL1 SignalName1 #define SIGNAL2 SignalName2 #define FUNCTION_NAME(signal) (void Callback_ ## signal ## (void)) ... ... FUNCTION_NAME(SIGNAL1) { .. return; }
问题是我收到了
void Callback_SIGNAL1(void)
代替
void Callback_SignalName1(void)
这有什么好方法吗?
您需要提供额外级别的“函数式宏”以确保正确扩展:
例如
#define SIGNAL1 SignalName1 #define SIGNAL2 SignalName2 #define MAKE_FN_NAME(x) void Callback_ ## x (void) #define FUNCTION_NAME(signal) MAKE_FN_NAME(signal) FUNCTION_NAME(SIGNAL1) { return; }
输出:
$ gcc -E prepro.cc # 1 "prepro.cc" # 1 "" # 1 "" # 1 "prepro.cc" void Callback_SignalName1 (void) { return; }