C预处理器,将macros的结果string化

我想把一个macros扩展的结果串联起来。

我已经尝试了以下内容:

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

并且TESTE被扩大到:“testing”,当我试图得到“thisisatest”时。 我知道这是预处理器的正确行为,但任何人都可以帮助我实现另一个?

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

喜欢这个:

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

原因是当macros参数被replace到macros体中时,它们被展开, 除非它们在该macros中出现#或##预处理器运算符。 因此, str (在你的代码中的TEST值)在QUOTE没有扩展,但是在EXPAND_AND_QUOTE被扩展了。

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

第一种情况:

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