假设我有两个宏定义:
#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。有没有办法在宏扩展发生之前连接令牌?
答案 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)
会怎样? :
TEST_NAME
创建有效令牌。 TEST_NAME
进行宏扩展,成为"joe"
。因此,根据您的问题输入,正常结果为"joe"
。
在你的情况下,你说它是0_NAME
唯一的原因是:
TEST
的扩展,这需要一些宏的定义,而你没有提到。或者
TEST_NAME
重新定义为0_NAME
。我的建议是:再次检查您的代码或重新制定您的问题。