首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Stringification它是如何工作的?

Stringification它是如何工作的?
EN

Stack Overflow用户
提问于 2013-06-08 01:25:10
回答 2查看 32.9K关注 0票数 56

我知道:

代码语言:javascript
复制
#define foo 4  
#define str(s) #s

用stringify写出:"foo",因为stringify首先执行文本扩展,但如下所示:

代码语言:javascript
复制
 #define xstr(s) str(s)
 #define str(s) #s
 #define foo 4

xstr(foo)写出:"4"

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-06-08 02:25:43

宏展开的相关步骤为(根据C 2011 n1570 6.10.3.1和C++ 1998 16.3.1):

对于每个参数,使用上面的宏replacement.

  • Rescan的相应结果替换更多的宏,然后对每个参数进行或
  1. 宏替换,以获得###.
  2. Apply宏替换的
  3. 进程标记。

因此,使用xstr(foo),我们可以:

  1. 替换文本str(s)不包含###,因此不会发生任何事情。
  2. 将参数foo替换为4,因此就好像使用了xstr(4)
  3. 在替换文本str(s)中,将参数s替换为4,重新扫描生成str(4).
  4. str(4)。(生成的步骤会生成”4”.)

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

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

票数 60
EN

Stack Overflow用户

发布于 2013-06-08 01:30:55

第一个案例

  1. Evaluate str(foo):用#foo替换str(foo),例如"foo"

第二种情况

  1. Evaluate xstr(foo):用str(<foo-value>)替换xstr(foo),即str(4)
  2. Evaluate str(4):用str(4)替换#4,即#4

一般来说,

预处理器对扩展宏变量的宏函数进行求值,直到不再求值为止

如果您定义

代码语言:javascript
复制
#define xstr(s) str(s) + 1
#define str(s) s + 1

在以下代码中

代码语言:javascript
复制
#define foo 4

int main()
{
    std::cout << str(foo) << '\n' 
              << xstr(foo) << '\n' ;

} 

它的评估结果如下

第一个字符串

  1. str(foo)代替<foo-value> + 1,即用更多来代替。完成。

结果是4+1

第二个字符串

  1. xstr(foo)代替str(<foo-value>) + 1,即用str(4)代替<4-value> + 1,即用4 + 1
  2. Nothing 来代替。

结果是4+1+1

票数 15
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16989730

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档