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; }