C预处理器,对宏的结果进行字符串化

时间:2010-08-05 21:30:52

标签: c-preprocessor stringification

我想将宏扩展的结果字符串化。

我尝试了以下内容:

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

并且TESTE扩展到:“TEST”,而我正试图获得“这个最好的”。我知道这是预处理器的正确行为,但任何人都可以帮我找到另一种方法吗?

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

2 个答案:

答案 0 :(得分:74)

像这样:

#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);
}

原因是当宏参数被替换为宏体时,它们被扩展为,除非它们与该宏中的#或##预处理器运算符一起出现。因此,str(代码中的值为TEST)未在QUOTE中展开,但会在EXPAND_AND_QUOTE中展开。

答案 1 :(得分:15)

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

第一案:

->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