我有一个这样的情况,我有很多生成的函数,并希望指出一些我创建的通用函数(允许我在生成的函数名称改变时重用基本代码).
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 "<built-in>" # 1 "<command-line>" # 1 "prepro.cc" void Callback_SignalName1 (void) { return; }