C预处理器定义生成的函数名称

the*_*e_e 15 c macros c-preprocessor

我有一种情况,我有很多生成的函数,并希望将它们指向我创建的一些通用函数(允许我在生成的函数名称更改时重用基本代码).

基本上,我有一个函数名列表如下:

void Callback_SignalName1(void);
void Callback_SignalName2(void);
...etc
Run Code Online (Sandbox Code Playgroud)

生成这些之后,我想定义一个宏来允许它们被一般地调用.我的想法是这样的,但我没有任何运气实现它...因为C预处理器采用宏的名称而不是宏定义为:

#define SIGNAL1 SignalName1
#define SIGNAL2 SignalName2

#define FUNCTION_NAME(signal) (void  Callback_ ## signal ## (void))
...
...
FUNCTION_NAME(SIGNAL1)
{
  ..
  return;
}
Run Code Online (Sandbox Code Playgroud)

问题是我收到了

void Callback_SIGNAL1(void)
Run Code Online (Sandbox Code Playgroud)

代替

void Callback_SignalName1(void)
Run Code Online (Sandbox Code Playgroud)

这有什么好办法吗?

CB *_*ley 31

您需要提供额外级别的"函数式宏"以确保正确扩展:

例如

#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;
}
Run Code Online (Sandbox Code Playgroud)

输出:

$ gcc -E prepro.cc 
# 1 "prepro.cc"
# 1 "<built-in>"
# 1 "<command-line>"
# 1 "prepro.cc"







void Callback_SignalName1 (void)
{
 return;
}
Run Code Online (Sandbox Code Playgroud)