繁体   English   中英

C 预处理器宏扩展

[英]C preprocessor macro expansion

我很难理解在以下上下文中 C 预处理器如何应用重写规则。 我有以下宏:

#define _A(x) "A" _##x
#define _B(x) "B" _##x
#define X(x) _##x

这个想法是这些宏中的每一个都使用连接来创建一个新的表达式,它本身可以是一个宏——如果它是一个宏,我希望它被扩展:

现在,以下扩展就像我期望的那样:

X(x)       expands to _x
X(A(x))    expands to "A" _x
X(A(B(x))) expands to "A" "B" _x

但是,一旦同一个宏被多次使用,扩展就会停止:

X(A(A(x)))       expands to "A" _A(x), expected "A" "A" _x
X(B(B(x)))       expands to "B" _B(x), expected "B" "B" _x
X(A(B(A(x))))    expands to "A" "B" _A(x), expected "A" "B" "A" _x 
X(A(B(A(B(x))))) expands to "A" "B" _A(B(x)), expected "A" "B" "A" "B" _x 

我猜这里有某种“只能扩展同名宏一次”的规则吗? 我可以做些什么来让宏以我想要的方式扩展?

当我想要进行宏扩展时,我通常使用这个图,我使用标准的6.10.3节构建了这个图。 希望能帮助到你...

在此输入图像描述

正如Toby已经提到的,嵌套宏不会递归扩展。

C99草案说宏扩展中不允许递归:

6.10.3.4重新扫描和进一步更换

  1. 在替换列表中的所有参数都已被替换并且已经进行###处理之后,将删除所有地标标记预处理标记。 然后重新扫描生成的预处理标记序列以及源文件的所有后续预处理标记,以替换更多的宏名称。
  2. 如果在替换列表的扫描期间找到要替换的宏的名称 (不包括源文件的其余预处理标记), 则不会替换它 此外,如果任何嵌套替换遇到要替换的宏的名称,则不会替换它。 这些未替换的宏名称预处理令牌不再可用于进一步替换,即使它们稍后(重新)检查在其中否则将替换该宏名称预处理令牌的上下文中。

所以X(A(A(x)))扩展为"A" _A(x) ,但正如您所见,该扩展本身并未扩展。

我有一个解决方案,给我发电子邮件 patrikfrnka@seznam.cz

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM