繁体   English   中英

是否保证永远不会发生类似函数的宏参数名称替换?

[英]Is function-like macro argument name substitution guaranteed to never happen?

考虑以下代码

#define foo 38
#define F(foo) G(foo)
F(42);

我希望这段代码无法编译,因为在应用第一行后,第二行应该转换为#define F(38) G(38)这没有任何意义。 但是在 g++ 上它成功编译为G(42) ,好像根本没有第一行。 我在 g++ docs 和 c 标准中都找不到任何提到这种行为的地方。 我知道代码很丑,一开始就不应该使用,但我想知道它是否有任何可移植性的保证。

C 2018 6.10 7 和 C++ 2017 (draft n4659) 19 [cpp] 6 都说:

除非另有说明,预处理指令中的预处理标记不受宏扩展的影响。

对于类函数宏的参数,没有另外说明。 因此,类函数宏定义中的参数名称不会由于先前的宏定义而被替换。

(另外说明宏扩展的示例包括#if指令和#include指令。)

暂无
暂无

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

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