根据 C99 规则预处理以下 3 行的正确输出是什么?
#define y(x) x
#define x(a) y(a
x(1) x(2)))
顺便说一句,linux 下的 cpp 会产生错误消息,但我不明白为什么答案不简单
1 2
假设 cpp 是正确的而我错了,我将非常感谢您的解释。
当找到宏时,预处理器会收集宏的参数,然后单独扫描每个宏参数,以在第一个宏扩展之前在参数内扩展其他宏:
6.10.3.1 参数替换
在确定了调用类函数宏的参数后,
发生参数替换。替换列表中的参数,除非前面有
由 # 或 ## 预处理标记或后跟 ## 预处理标记(见下文)表示
在其中包含的所有宏都被替换后,替换为相应的参数
扩大了。在被替换之前,每个参数的预处理标记是
完全替换宏,就好像它们构成了预处理文件的其余部分一样;没有其他
预处理标记可用。
所以在这个具体的例子中,它看到x(1)
并扩展它,给出
y(1 x(2)))
然后它识别宏调用y(1 x(2))
,与参数1 x(2)
并预扫描宏以进行扩展。其中发现x(2)
扩展到y(2
然后由于不存在而触发错误)
为了y
宏。请注意,此时它仍在寻求扩展第一个论点y
宏,因此它会单独查看它,而不考虑输入文件的其余部分,这与 6.10.3.4 中发生的扩展不同
现在有一些问题是这实际上是否应该是一个错误,或者预处理器是否应该处理它y(2
序列根本不是宏调用,因为没有“)”。如果是后者,那么它将扩展 y 调用1 y(2
然后将与输入的其余部分相结合()
)并最终扩展到1 2
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)