C++中是否允许使用#define _min?合规性及编译器兼容性问询
关于宏
#define _min的安全性疑问 本问题是对Stack Overflow讨论《Do preprocessor defines substitute in operator""_name》评论区内容的跟进。
根据C++标准相关说明,保留标识符包含:
全局命名空间中以下划线开头的标识符。
已知宏不属于命名空间范畴,按上述规则,#define _min不应导致程序格式错误且无需诊断,但这么做真的安全吗?能否保证合规编译器不会以受该宏影响的方式使用此标识符?
解答
虽然宏不属于命名空间范畴,单看标准规则的字面意思,#define _min确实不算直接违反「保留标识符」的规定,也不会强制要求编译器给出诊断,但这么做绝对不安全:
- 编译器和标准库的内部实现里,很可能在全局命名空间用到
_min这类以下划线开头的标识符——比如内部辅助宏、函数名。你定义的宏会在预编译阶段替换所有匹配的文本,一旦和编译器内部的同名标识符撞车,轻则编译报错,重则引发难以排查的未定义行为。 - C++标准把全局命名空间中下划线开头的标识符划为保留,就是给编译器实现留足扩展空间。现在的编译器可能没用到
_min,但未来版本或者其他合规编译器完全可能将其纳入内部使用,你的代码会瞬间失去可移植性。 - 多数静态代码检查工具都会把定义下划线开头的宏标记为违规,这会给代码的质量管控添乱。
总之,这种写法的隐性风险极高,完全不建议这么做。
内容的提问来源于stack exchange,提问作者Yksisarvinen
相关产品推荐
相关产品推荐

