抑制或覆盖关键字NULL

时间:2016-02-07 06:03:57

标签: c++ c++11

我正在解析一个复杂的语法,要求我像这样定义一个enum class

enum class NULLSTYLE {
    NULL,
    NOTNULL
};

由于我可以在C ++ 11中使用0nullptr,我能以某种方式抑制或覆盖C ++自己对NULL的定义,以便我可能坚持我的语法?

1 个答案:

答案 0 :(得分:6)

NULL不是关键字。 C ++ 11的nullptr是。 NULL is a macro.如果你没有直接或间接地包含任何定义它的标题,那么理论上你可以将它用于任何事情。

然而,在实践中,这是不可能的,因为:

  1. NULL由许多标准标头定义,标头可以(通常也会)间接包含许多其他标准标头。您几乎不想编写一个枚举,以防止其客户使用标准库。

  2. 使用ALL_UPPERCASE作为非宏标识符通常被视为不良做法(example reference)。

  3. 您可以处理不使用nullptr但仍依赖NULL的遗留代码。

  4. 你可以#undef NULL,但这通常是一个可怕的黑客。您再也无法编写任何需要枚举 NULL宏的客户端代码,更不用说它会为每个维护代码的人造成无穷无尽的混乱。

    enum class NULLSTYLE {
        NULL,
        NOTNULL
    };
    

    这只是一个错误命名的情况。做到这样:

    enum class NullStyle {
        Null,
        NotNull
    };