扩展前连接宏名称

Concatenating macro name before expansion

假设我有两个宏定义:

#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。有没有办法在宏扩展发生之前连接标记?

你的代码可以简化为(为了理解发生了什么而已):

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

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

From GNU C Preprocessor documentation (3.5):

If either of the tokens next to an ‘##’ is a parameter name, it is replaced by its actual argument before ‘##’ executes. As with stringification, the actual argument is not macro-expanded first. If the argument is empty, that ‘##’ has no effect.

ID_TO_NAME(TEST) 会怎样? :

  1. 所以首先会生成 TEST_NAME 创建一个有效的令牌。
  2. 之后,CPP 将对 TEST_NAME 进行宏扩展,变为 "joe"

因此根据您输入的问题,正常结果将是 "joe"

你说的是 0_NAME 唯一的原因是:

  • 在连接之前对参数 TEST 进行了扩展,这需要一些宏定义,而您没有提到。

  • 在调用之前将 object-like 宏 TEST_NAME 重新定义为 0_NAME

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