假设我有两个宏定义:
#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 标记。问题是标记之一是参数。
如果“##”旁边的任何一个标记是参数名称,则它是 在“##”执行之前替换为实际参数。与 字符串化,实际参数不首先进行宏扩展。如果 参数为空,‘##’没有任何作用。
ID_TO_NAME(TEST)
会发生什么? :
TEST_NAME
TEST_NAME
。
"joe"
基于您问题的输入。 就您而言,您说这是
"joe"
,唯一的原因是:
在连接之前有一个参数
0_NAME
在调用之前,将类似对象的宏
TEST
TEST_NAME
。