首页 > 后端开发 > C++ > 为什么类 C 宏扩展中 `xstr(foo)` 输出'4”,而 `str(foo)` 输出'foo”?

为什么类 C 宏扩展中 `xstr(foo)` 输出'4”,而 `str(foo)` 输出'foo”?

Linda Hamilton
发布: 2024-12-28 14:30:11
原创
240 人浏览过

Why Does `xstr(foo)` Output

理解字符串化:宏扩展的关键步骤

类 C 语言中的字符串化概念允许您将表达式转换为字符串。了解此过程中涉及的步骤对于有效地使用宏至关重要。

问题:输出差异

考虑以下宏定义:

#define foo 4
#define str(s) #s
登录后复制

当您在代码中使用 str(foo) 时,它将输出“foo”,因为字符串化(步骤 1)是在文本扩展(步骤2).

但是,如果你定义一个额外的宏:

#define xstr(s) str(s)
登录后复制

并使用xstr(foo),输出将令人惊讶地是“4”。这种差异需要探索字符串化过程。

宏扩展的步骤

根据 C 和 C 标准,宏扩展的过程涉及几个步骤:

  1. 预处理: 前面带有 # 或 ## 的标记是已处理。
  2. 参数替换: 宏应用于每个参数。
  3. 参数替换: 参数被替换为相应的宏结果。
  4. 重新扫描:重新扫描代码以获取更多宏

将步骤应用于 xstr(foo)

  1. 预处理: 没有适用的标记。
  2. 参数替换: foo 替换为4.
  3. 参数替换:在str(s)中,s被4替换,生成str(4)。
  4. 重新扫描: str (4)重新扫描,得到输出"4".

为什么 str(foo) 输出 "foo"

与 xstr(foo) 相比,str(foo) 输出 "foo"因为:

  • 预处理:没有字符串化标记存在。
  • 参数替换:无适用。
  • 参数替换:#foo 保持不变,因为 foo 尚未替换为 4。
  • 重新扫描: #foo 未重新扫描,产生"foo"。

因此,使用 xstr 这样的辅助宏可确保在字符串化(步骤 1)之前执行文本扩展(步骤 2),从而实现正确的字符串转换。

以上是为什么类 C 宏扩展中 `xstr(foo)` 输出'4”,而 `str(foo)` 输出'foo”?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板