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
    创建一个有效的令牌
  • 在此之后,CPP将进行宏扩展,以
    测试\u NAME
    ,它将成为
    “joe”
  • 因此,根据您的问题输入,正常结果将是“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)