C 扩展前连接宏名称
假设我有两个宏定义:C 扩展前连接宏名称,c,macros,concatenation,token,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\u NAME而不是TEST\u NAME。有没有办法在宏展开之前连接令牌?您的代码可以简化为(为了只了解发生了什么): ##是预处理器中的串联运算符,它粘贴两个标
#define TEST 0
#define TEST_NAME "Joe"
我想创建一个宏,可以从第一个宏访问第二个定义
我尝试了以下方法
#define ID_TO_NAME(id) id ## _NAME
printf("%s\n", ID_TO_NAME(TEST));
但是,这不起作用,因为结果是0\u NAME而不是TEST\u NAME。有没有办法在宏展开之前连接令牌?您的代码可以简化为(为了只了解发生了什么):
##
是预处理器中的串联运算符,它粘贴两个标记以形成另一个有效的标记。问题是其中一个标记是参数
如果“##”旁边的任何一个标记是参数名,则为
替换为执行“##”之前的实际参数。如同
字符串化,实际参数不是首先进行宏展开的。如果
参数为空,表示“##”无效
ID\u to\u NAME(TEST)
会发生什么变化
TEST\u NAME
创建一个有效的令牌李>
测试\u NAME
,它将成为“joe”
0\u NAME
唯一的原因是:
- 在连接之前,对参数
进行了扩展,这需要宏的一些定义,您没有提到TEST
- 在调用之前,将宏
等对象重新定义为TEST\u NAME
0\u NAME
我的建议是:再次检查您的代码或重新编写您的问题。您使用的是哪个预处理器?对我有效:在您的问题中,请使用不适合您的确切代码;否则,很难或不可能猜测问题可能是什么。(在本例中,我猜您正在嵌套宏调用。)/
#define TEST 0
#define TEST_NAME "Joe"
#define ID_TO_NAME(id) id ## _NAME
ID_TO_NAME(TEST)