【问题标题】:use peprocessor macros to generate function calls使用 peprocessor 宏生成函数调用
【发布时间】:2020-11-18 10:23:33
【问题描述】:

我有一些特定的函数原型

void init_channel_0(void);
void init_channel_1(void);
void init_channel_2(void);
void init_channel_3(void);
void init_channel_4(void);
void init_channel_5(void);
void init_channel_6(void);
void init_channel_7(void);
void init_channel_8(void);
void init_channel_9(void);

我想在循环中调用这些函数:

#define CHANNEL_INIT(channel)  init_channel_##(#channel)

for (int i = 0; i < 10; i++) { 
   INIT_CHANNEL(i)
} 

我尝试使用一些宏定义来执行此操作,但没有成功 有没有办法做到这一点?

【问题讨论】:

  • 应该是init_channel_##channel##()IMO,也就是说,在破译你相当神秘的描述之后。

标签: c macros


【解决方案1】:

您不能将运行时值传递给预处理器。使用数组。

typedef void channel_func_t (void);

...

channel_func_t*const CHANNEL_INIT [] =
{
  init_channel_0,
  init_channel_1,
  ..
};

...

for (int i = 0; i < 10; i++) { 
  CHANNEL_INIT[i]();
}

【讨论】:

    【解决方案2】:

    通常的方法是生成一些 C 代码。

    你会编写一些元程序(用 C 或 PythonGuileLuaGNU gawk 或任何你喜欢的脚本语言)生成一个包含 _do_init_channel.inc 的文件

     /// generated _do_init_channel.inc
     init_channel_0();
     init_channel_1();
    

    等等……

    你会在适当的地方#include "do_init_channel.inc"

    当然,相应地调整您的构建自动化(例如您的Makefile)。

    answer by Lundin 是正确的,但如果 init_channel_k 函数很小且已知,优化编译器可以轻松内联它们。

    顺便说一句,您可能会对现有的 C 代码生成器感兴趣,例如GNU bisonSWIGRPCGEN

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-07-04
      • 1970-01-01
      • 1970-01-01
      • 2011-07-18
      • 1970-01-01
      • 2011-12-12
      • 1970-01-01
      相关资源
      最近更新 更多