我知道:
#define foo 4
#define str(s) #s用stringify写出:"foo",因为stringify首先执行文本扩展,但如下所示:
#define xstr(s) str(s)
#define str(s) #s
#define foo 4用xstr(foo)写出:"4"。
为什么?该过程涉及哪些步骤?
发布于 2013-06-08 02:25:43
宏展开的相关步骤为(根据C 2011 n1570 6.10.3.1和C++ 1998 16.3.1):
对于每个参数,使用上面的宏replacement.
#或##.因此,使用xstr(foo),我们可以:
str(s)不包含#或##,因此不会发生任何事情。foo替换为4,因此就好像使用了xstr(4)。str(s)中,将参数s替换为4,重新扫描生成str(4).str(4)。(生成的步骤会生成”4”.)请注意,str(foo)的问题在于,步骤2会在步骤1之后进行,该步骤会将foo替换为4,该步骤会将参数更改为字符串。在步骤1中,foo仍然是foo;它还没有被4替换,所以结果是”foo”。
这就是使用帮助器宏的原因。它允许我们执行步骤2,然后使用另一个宏来执行步骤1。
发布于 2013-06-08 01:30:55
第一个案例
str(foo):用#foo替换str(foo),例如"foo"第二种情况
xstr(foo):用str(<foo-value>)替换xstr(foo),即str(4)str(4):用str(4)替换#4,即#4一般来说,
预处理器对扩展宏变量的宏函数进行求值,直到不再求值为止
如果您定义
#define xstr(s) str(s) + 1
#define str(s) s + 1在以下代码中
#define foo 4
int main()
{
std::cout << str(foo) << '\n'
<< xstr(foo) << '\n' ;
} 它的评估结果如下
第一个字符串
str(foo)代替<foo-value> + 1,即用更多来代替。完成。结果是4+1
第二个字符串
xstr(foo)代替str(<foo-value>) + 1,即用str(4)代替<4-value> + 1,即用4 + 1结果是4+1+1
https://stackoverflow.com/questions/16989730
复制相似问题