在扩展之前连接宏名称

问题描述 投票:0回答:1

假设我有两个宏定义:

#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。有没有办法在宏扩展发生之前连接标记?

c macros concatenation
1个回答
2
投票

您的代码可以简化为(仅为了了解发生了什么):

#define TEST 0
#define TEST_NAME "Joe"
#define ID_TO_NAME(id) id ## _NAME
ID_TO_NAME(TEST)

##
是预处理器中的串联运算符,它粘贴 2 个标记以形成另一个 valid 标记。问题是标记之一是参数。

来自 GNU C 预处理器文档 (3.5):

如果“##”旁边的任何一个标记是参数名称,则它是 在“##”执行之前替换为实际参数。与 字符串化,实际参数不首先进行宏扩展。如果 参数为空,‘##’没有任何作用。

ID_TO_NAME(TEST)
会发生什么? :

  1. 首先将生成它以创建一个有效的令牌。
    之后CPP将对
  2. TEST_NAME
  3. 进行宏扩展,变成
    TEST_NAME
    
    
    
  4. 因此,正常结果将是
"joe"

基于您问题的输入
就您而言,您说这是

"joe"

,唯一的原因是:


在连接之前有一个参数
    0_NAME
  • 的扩展,这需要一些宏的定义,而你没有提到。
    
    
    
  • 或者

在调用之前,将类似对象的宏
    TEST
  • 重新定义为
    TEST_NAME
    
    
    
  • 我的建议是:再次检查您的代码或重新表述您的问题。

© www.soinside.com 2019 - 2024. All rights reserved.