c++ - #undef'ing 关键字是否非法?

标签 c++

我预计以下程序会在 GCC 或 Clang 中发出诊断信息:

#undef protected
#undef private

由于 [macro.names]/2:

A translation unit shall not #define or #undef names lexically identical to keywords, to the identifiers listed in Table 3, or to the attribute-tokens described in 7.6.

protectedprivate 都列在表 3 中。通过 N3337 快速查找“不需要诊断”没有发现任何东西。那么在这种情况下是否需要编译器进行投诉?

最佳答案

[macro.names] 是 [reserved.names] 的一部分,它声明“如果程序在保留的上下文中声明或定义名称,而不是明确允许的 this Clause, its behavior is undefined."所以它是未定义的行为。

在实践中,大多数编译器不会提示有两个原因:第一个是因为预处理通常发生在编译器评估符号是否是关键字之前;这是翻译的早期阶段。也因为这样的声明只有在您实际使用标准库时才是非法的(尽管其他库,如 Posix 或 Windows,可能并且可能会施加类似的规则)。

编辑:

只是一个一般性的评论:虽然没有对此的全局声明 在标准的影响下,有一个普遍的、基本的原则,即 违反库约束是未定义的行为;目的是 编译器不需要知道关于库的任何信息,而且 一个实现可以处理 #include <vector>一模一样 #include "MyHeader.hpp" (除了它寻找 文件)。原始帖子中引用的限制是 对使用该库的程序的约束,并且仅适用于此类 程式。像这样的东西:

#define while if
int
main( int argc, char** argv )
{
    int retval = 0;
    while ( argc > 0 ) {
        ++ retval;
        -- argc;
    }
    return retval;
}

是一个定义良好且合法的 C++(和 C)程序,保证 返回 1。(当然,我不推荐这样的东西。)

关于c++ - #undef'ing 关键字是否非法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27377407/

相关文章:

c++ - 在预编译单元中定义宏条件语句是否明智?

c++ - 返回异步结果 - 高效处理同步情况

c++ - std::stable_sort:如何选择内存优化算法而不是时间优化算法?

c++ - 类构造函数错误,类 "classname"没有成员 "classname"

c++ - 我什么时候应该调整 Direct3D 11 后缓冲区的大小以防止其在调整大小期间被拉伸(stretch)?

c++ - 为什么会出现访问冲突运行时错误?

c++ - 初始化时不会调用任何复制/move 构造函数/赋值

c++ 增量运算符

c++ - 在任意加长的集合中查找最大数量是行不通的

c++ - 基于单个属性/访问器的聚合设计类层次结构