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