Mar*_* A. 50 c c++ stringification c-preprocessor
我知道:
#define foo 4
#define str(s) #s
Run Code Online (Sandbox Code Playgroud)
与str(foo)
写出:"foo"
因为字符串化的第一个文本扩展的执行,但这样的:
#define xstr(s) str(s)
#define str(s) #s
#define foo 4
Run Code Online (Sandbox Code Playgroud)
与xstr(foo)
写出:"4"
.
为什么?该过程涉及哪些步骤?
Eri*_*hil 55
宏扩展的相关步骤是:(的每个C 2011 [n1570] 6.10.3.1和C++ 1998 16.3.1):
#
或的处理令牌##
.因此,xstr(foo)
我们有:
str(s)
包含no #
或##
,因此没有任何反应.foo
被替换为4
,所以就好像xstr(4)
已经被使用了一样.str(s)
,参数s
替换为4
,生成str(4)
.str(4)
重新扫描.(由此产生的步骤产生”4”
.)请注意,问题str(foo)
在于步骤2将替换foo
为4
步骤1,它将参数更改为字符串.在步骤1中,foo
仍然是foo
; 它没有被替换4
,所以结果是”foo”
.
这就是使用辅助宏的原因.它允许我们执行第2步,然后使用另一个宏执行第1步.
Lol*_*4t0 13
str(foo)
:替换str(foo)
用#foo
,即"foo"
xstr(foo)
:替换xstr(foo)
用str(<foo-value>)
,即str(4)
str(4)
:替换str(4)
用#4
,即"4"
预处理器评估扩展宏变量的宏函数,直到它无需评估:
如果你定义
#define xstr(s) str(s) + 1
#define str(s) s + 1
Run Code Online (Sandbox Code Playgroud)
在以下代码中
#define foo 4
int main()
{
std::cout << str(foo) << '\n'
<< xstr(foo) << '\n' ;
}
Run Code Online (Sandbox Code Playgroud)
它会评估像
str(foo)
有<foo-value> + 1
,即4 + 1
结果是4 + 1
xstr(foo)
有str(<foo-value>) + 1
,即str(4) + 1
str(4)
有<4-value> + 1
,即4 + 1
结果是4 + 1 + 1