扩展前连接宏名称

时间:2017-01-19 02:32:50

标签: c macros concatenation token

假设我有两个宏定义:

#define TEST 0
#define TEST_NAME "Joe"

我想创建一个可以从第一个定义访问第二个定义的宏。

我尝试了以下

#define ID_TO_NAME(id) id ## _NAME
printf("%s\n", ID_TO_NAME(TEST));

但是这不起作用,因为结果是0_NAME而不是TEST_NAME。有没有办法在宏扩展发生之前连接令牌?

1 个答案:

答案 0 :(得分:1)

您的代码可以缩减为(为了理解发生的事情):

#define TEST 0
#define TEST_NAME "Joe"
#define ID_TO_NAME(id) id ## _NAME
ID_TO_NAME(TEST)

##是预处理器中的串联运算符,它粘贴2个令牌以形成另一个有效令牌。问题是其中一个标记是参数参数。

<强> From GNU C Preprocessor documentation (3.5):

  

如果'##'旁边的任何一个令牌是参数名称就是   在'##'执行之前由其实际参数替换。和。一样   stringification,实际参数不是首先进行宏扩展。如果   参数为空,'##'无效。

ID_TO_NAME(TEST)会怎样? :

  1. 首先,它将生成TEST_NAME创建有效令牌。
  2. 之后,CPP将对TEST_NAME进行宏扩展,成为"joe"
  3. 因此,根据您的问题输入,正常结果为"joe"

    在你的情况下,你说它是0_NAME唯一的原因是:

    • 在连接之前有一个参数TEST的扩展,这需要一些宏的定义,而你没有提到。

    或者

    • 在调用之前,有一个类似对象的宏TEST_NAME重新定义为0_NAME

    我的建议是:再次检查您的代码或重新制定您的问题。