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

19

我有这样的情况,我有很多生成的函数,并希望将它们指向我创建的一些通用函数(以便在生成的函数名称更改时重用基础代码)。

本质上,我有一个函数名称列表,如下所示:

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 FUNCTION_NAME(funcName) void funcName(void) 吗? - Shay Erlichmen
抱歉,为了更清晰明确,我编辑了一下...我漏掉了一个重要部分,还有另一个函数名的部分需要放在那里... - erik
请注意,signal(void)之间的##不正确。##是通过连接多个标记来创建单个标记的。开括号不能(也不应该!)成为将成为函数名称的标记的一部分。 - CB Bailey
1个回答

37
你需要提供一个额外的“类似函数的宏”级别来确保正确扩展:
例如:
#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;
}

否则,##运算符将会将参数字面量连接到Callback_。 - Adriaan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接