为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

C++ C
炎炎设计 2019-09-02 08:56:45
我知道:#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"。为什么?该过程涉及哪些步骤?
查看完整描述

2 回答

?
喵喵时光机

TA贡献1846条经验 获得超7个赞

宏观扩张的相关步骤是(根据C 2011 [n1570] 6.10.3.1和C ++ 1998 16.3.1):

  1. 处理前缀为#或的处理令牌##

  2. 将宏替换应用于每个参数。

  3. 将每个参数替换为上述宏替换的相应结果。

  4. 重新扫描更多宏。

因此,xstr(foo)我们有:

  1. 替换文本,str(s)包含no ###,因此没有任何反应。

  2. 参数foo被替换为4,所以就好像xstr(4)已经被使用了一样。

  3. 在替换文本中str(s),参数s替换为4,生成str(4)

  4. str(4)重新扫描。(由此产生的步骤产生”4”。)

请注意,问题str(foo)在于步骤2将替换foo4步骤1,它将参数更改为字符串。在步骤1中,foo仍然是foo; 它没有被替换4,所以结果是”foo”

这就是使用辅助宏的原因。它允许我们执行第2步,然后使用另一个宏执行第1步。


查看完整回答
反对 回复 2019-09-02
?
蛊毒传说

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


查看完整回答
反对 回复 2019-09-02
  • 2 回答
  • 0 关注
  • 395 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信