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) + 1str(4)有<4-value> + 1,即4 + 1结果是4 + 1 + 1