C预处理器,将宏的结果转换为字符串

52

我想将宏展开的结果转换为字符串。

我尝试了以下代码:

#define QUOTE(str) #str
#define TEST thisisatest
#define TESTE QUOTE(TEST)

TESTE会被扩展为"TEST",然而我想要的是"thisisatest"。我知道这是预处理器的正确行为,但有没有人可以帮我找到实现另一种行为的方法?

Using TESTE #TEST is not valid
Using TESTE QUOTE(thisisatest) is not what I'm trying to do

1
https://dev59.com/vHRA5IYBdhLWcg3w2x6W - Ciro Santilli OurBigBook.com
2个回答

84
就像这样:

#include <stdio.h>

#define QUOTE(str) #str
#define EXPAND_AND_QUOTE(str) QUOTE(str)
#define TEST thisisatest
#define TESTE EXPAND_AND_QUOTE(TEST)

int main() {
    printf(TESTE);
}

之所以这样做是因为当宏参数替换到宏体中时,它们会被扩展,除非它们在该宏中出现了 # 或 ## 预处理器操作符。因此,在 QUOTE 中,str(在您的代码中具有值TEST)不会被扩展,但是在EXPAND_AND_QUOTE 中会被扩展。


#define PE(BZL,YY) printf("错误 - " #BZL ":结果:0x%08x!", YY); 执行中:int variable1=1; PE(Test1,variable1); --> 打印结果:错误 - Test1:结果:0x1! - Joniale

18
为了进一步澄清,预处理器本质上是为了执行另一个“阶段”。即:

第一种情况:

->TESTE
->QUOTE(TEST) # preprocessor encounters QUOTE 
 # first so it expands it *without expanding its argument* 
 # as the '#' symbol is used
->TEST

第二种情况:

->TESTE
->EXPAND_AND_QUOTE(TEST)
->QUOTE(thisisatest) 
  # after expanding EXPAND_AND_QUOTE
  # in the previous line
  # the preprocessor checked for more macros
  # to expand, it found TEST and expanded it
  # to 'thisisatest'
->thisisatest

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接