Yks*_*nen 11 c++ language-lawyer
跟进Do preprocessor Defines replacement in `operator""_name`的评论中的讨论
根据cppreference,保留标识符包括
在全局命名空间中,以下划线开头的标识符。
据我所知,宏不是命名空间的一部分,因此据此#define _min不应使我的程序格式错误,无需诊断。但这样做真的可以吗?我是否可以保证兼容的编译器永远不会以可能被该宏破坏的方式使用该标识符?
[lex.name]/3.2表示类似 的标识符_min,即以下划线开头,
[...] 保留给实现用作全局命名空间中的名称。
该措辞并没有说您不能在全局命名空间范围内使用标识符,但您必须确保实现可以这样做。如果将#define其作为宏,然后包含标准库标头,则实现无法可靠地在全局命名空间范围中使用该名称。
因此,如果您在相应#define的#undef. 然而,这似乎并不是制作这些#defineUB 的目的。只要在预处理过程中不影响标准库头,似乎就没有问题。另请参阅答案下的评论。
-Wreserved-identifierRichard Smith(C++ 标准编辑器)在对 Clang警告的评论中也给出了上述的解释,即 UB 如果标准库头会看到宏定义,尽管带有“我认为”的限定。
标准的[diff.cpp03.lex]/2#define _x中确实有一个代码示例,它暗示(至少其本身)定义良好,尽管它位于标准的非规范部分。
| 归档时间: |
|
| 查看次数: |
322 次 |
| 最近记录: |