字符串化 - 它是如何工作的?

我知道:


#define foo 4  

#define str(s) #s

与str(foo)写出:"foo"因为字符串化的第一个文本扩展的执行,但这样的:


 #define xstr(s) str(s)

 #define str(s) #s

 #define foo 4

与xstr(foo)写出:"4"。


为什么?该过程涉及哪些步骤?


炎炎设计
浏览 396回答 2
2回答

喵喵时光机

宏观扩张的相关步骤是(根据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步。

蛊毒传说

第一个案例评价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 4int main(){&nbsp; &nbsp; std::cout << str(foo) << '\n'&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; << xstr(foo) << '\n' ;}&nbsp;它会评估像第一串替补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
打开App,查看更多内容
随时随地看视频慕课网APP