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

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

Linda Hamilton
Linda Hamilton原创
2024-12-28 14:30:11230浏览

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中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn