2 回答
TA贡献1866条经验 获得超5个赞
像这样:
#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。
TA贡献1786条经验 获得超13个赞
为了进一步说明,基本上使预处理器执行另一个“阶段”。即:
第一种情况:
->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
- 2 回答
- 0 关注
- 417 浏览
添加回答
举报