抑制或覆盖关键字NULL

Arn*_*amm 0 c++ c++11

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

enum class NULLSTYLE {
    NULL,
    NOTNULL
};
Run Code Online (Sandbox Code Playgroud)

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

Chr*_*ckl 6

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

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

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

  2. 使用ALL_UPPERCASE用于非宏标识符通常被认为是不好的实践反正(例如参考).

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

你可以#undef NULL,但这通常是一个可怕的黑客.你可以不再写这既需要您的枚举任何客户端代码,并NULL宏观,更何况事实,即它会为每个人创造维护代码无休止的困惑.

enum class NULLSTYLE {
    NULL,
    NOTNULL
};
Run Code Online (Sandbox Code Playgroud)

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

enum class NullStyle {
    Null,
    NotNull
};
Run Code Online (Sandbox Code Playgroud)