扩展前连接宏名称
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)
会怎样? :
- 所以首先会生成
TEST_NAME
创建一个有效的令牌。
- 之后,CPP 将对
TEST_NAME
进行宏扩展,变为 "joe"
。
因此根据您输入的问题,正常结果将是 "joe"
。
你说的是 0_NAME
唯一的原因是:
- 在连接之前对参数
TEST
进行了扩展,这需要一些宏定义,而您没有提到。
或
- 在调用之前将 object-like 宏
TEST_NAME
重新定义为 0_NAME
。
我的建议是:再次检查您的代码或重新表述您的问题。
假设我有两个宏定义:
#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)
会怎样? :
- 所以首先会生成
TEST_NAME
创建一个有效的令牌。 - 之后,CPP 将对
TEST_NAME
进行宏扩展,变为"joe"
。
因此根据您输入的问题,正常结果将是 "joe"
。
你说的是 0_NAME
唯一的原因是:
- 在连接之前对参数
TEST
进行了扩展,这需要一些宏定义,而您没有提到。
或
- 在调用之前将 object-like 宏
TEST_NAME
重新定义为0_NAME
。
我的建议是:再次检查您的代码或重新表述您的问题。