2 回答
TA贡献1846条经验 获得超7个赞
宏观扩张的相关步骤是(根据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步。
TA贡献1895条经验 获得超3个赞
第一个案例
评价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
在以下代码中
#define foo 4
int main()
{
std::cout << str(foo) << '\n'
<< xstr(foo) << '\n' ;
}
它会评估像
第一串
替补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
- 2 回答
- 0 关注
- 395 浏览
添加回答
举报