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

标签 c macros c-preprocessor

我有很多生成的函数,我想将它们指向我创建的一些通用函数(以允许我在生成的函数名称更改时重用基本代码)。

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

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

关于为生成的函数名称定义的 C 预处理器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1253934/

相关文章:

c++ - 如果我的钱有限,如何在 DAG 中找到最便宜的方式?

c++ - LLVM - 使用 clang 自动运行 Own Pass

c++ - 可变参数宏扩展

c++ - 内联函数和宏哪个更快

c - 将位域打包成字节的 C 预处理器宏?

有人可以改进我的堆数据结构代码吗?

c - 是否有任何 C 函数可以为给定的输入值返回常量变量名称?

c - 为什么 (void)0 会停止 "statement has no effect"警告?

c++ - 使用预处理器定义函数调用的缺点是什么?

c++ - 如何为相同的预处理程序变量编译C++