连接宏名称

时间:2017-12-15 10:07:34

标签: c c-preprocessor

我正在尝试为路由层创建一些宏。路由器应该能够从其他模块调用功能,路由基于通道。

我有2个枚举:

typedef enum
{
    AModule,
    BModule
}Module;

typedef enum
{
    CH0,
    CH1
}Channels;

配置:

#define AModule_Init(param) ExternalInitFunction(param)
#define CH0_Module AModule
#define CH1_Module BModule

路由器宏:

#define GetModule(channel) (channel##_Module)
#define RouterInit(channel,param) GetModule(channel)##_Init(param)

我想要这样做:

RouterInit(CH0,param);

我期待这个流程:

  • RouterInit(CH0,param)=>
  • GetModule(CH0)## _ Init(param)=>
  • CH0_Module ## _ Init(param)=>
  • AModule ## _ Init(param)=>
  • AModule_Init(param)=>
  • ExternalInitFunction(PARAM)

我收到错误:期待&#34 ;;"

1 个答案:

答案 0 :(得分:4)

预处理器无法执行2次传递。为什么不在1遍中定义RouterInit

#define RouterInit(channel,param) channel##_Module##_Init(param)

int main()
{    
    RouterInit(CH0,12);
}

该代码段gcc -E的结果(以及您声明的其他内容):

int main()
{    
   CH0_Module_Init(12);
}