首页 > 后端开发 > C++ > 为什么 C/C 宏中的字符串化在嵌套时会产生意外结果?

为什么 C/C 宏中的字符串化在嵌套时会产生意外结果?

DDD
发布: 2024-12-17 11:03:25
原创
645 人浏览过

Why Does Stringification in C/C   Macros Produce Unexpected Results When Nested?

字符串化:了解过程

在处理 C 和 C 等编程语言中的宏时,字符串化的概念可能很有趣。字符串化将宏的参数转换为字符串文字。本文探讨了字符串化的工作原理,特别关注意外输出结果的常见场景。

例如,在 C 语言中,字符串化通常使用 # 运算符完成,如下所示:

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

考虑以下宏定义:

#define foo 4
登录后复制

在 foo 上使用 str 宏将输出“foo”而不是“4”。这是因为 C 中的宏展开过程涉及多个步骤:

  1. 预处理器处理: 首先处理 #define 等预处理器指令。
  2. 字符串化: 应用像 str() 这样的宏,将它们的参数转换为字符串。
  3. 令牌替换: 像 foo 这样的令牌将替换为其定义的值。

对于 str(foo),字符串化发生在步骤 2 中,将 foo 转换为“foo”。然后,第 3 步将“foo”替换为定义的值 4,从而得到输出“4”。

但是,当 str() 用作另一个宏的参数时,例如:

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

可能会发生意外行为。使用 xstr(foo) 将输出“4”而不是“foo”。

要理解为什么会发生这种情况,我们需要考虑 xstr() 扩展中涉及的步骤:

  1. 字符串化:不存在 # 或 ## 标记,因此不执行任何操作。
  2. 参数替换:foo 替换为4.
  3. 参数替换:str() 中的 s 被 4 替换,产生 str(4)。
  4. 重新扫描:重新扫描 str(4)(产生输出“4”)。

在 xstr(foo) 中,步骤 2 将参数 foo 替换为 4,然后才应用步骤 1 来转换将结果 str(4) 字符串化为“4”。

这说明了理解宏扩展过程以及不同步骤执行顺序的重要性。通过使用首先执行特定步骤的辅助宏,开发人员可以控制字符串化的结果并实现所需的行为。

以上是为什么 C/C 宏中的字符串化在嵌套时会产生意外结果?的详细内容。更多信息请关注PHP中文网其他相关文章!

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