【问题标题】:Define null as a lower case version of NULL? c++将 null 定义为 NULL 的小写版本? C++
【发布时间】:2015-04-03 07:11:37
【问题描述】:

这里有个快速的问题,我不喜欢总是用大写输入NULL,我想知道我是否可以定义一个小写 版本。

当我尝试在头文件中将其定义为:

#define null NULL;

它允许编译这一行,但如果我尝试在代码中的任何位置调用 null,我会收到语法错误。

例如,如果我写:

if(root == null){ /* Code here */}

Eclipse 告诉我这是一个语法错误,如果我尝试构建我的项目,我会收到此错误:

NULL是不允许我这样做的特殊情况还是我做错了什么?

【问题讨论】:

  • 您使用的是 C++11 或更高版本吗? ... :)
  • 您遇到什么错误?举个小例子吧。
  • 在 C++11 中,你应该使用nullptr 而不是NULL
  • 去掉分号,或者按照 Bjarne Stroustrup 的做法,直接使用 0。
  • 不,不要只使用 0。

标签: c++ null user-defined-types


【解决方案1】:

如果您使用的是 C++11 编译器,请使用 nullptr,不要打扰 #define

如果您必须使用#define,请从该行中删除;

#define null NULL

【讨论】:

  • 为什么他们在 C++11 中添加了 nullptr 而不是简单地使用 null?
  • @JamesBedford,我不遵循标准化流程。我没有答案。
【解决方案2】:

行尾的分号错误。正确的

#define null NULL

【讨论】:

  • 当你#define null NULL;预处理器将 if (root == null) 行替换为 if (root == NULL;) 会出现语法错误。
【解决方案3】:

正如其他答案已经说明的那样,您的错误是写#define null NULL; 而不是#define null NULL。如果你想定义null,你应该把它定义为nullptr。猜猜foo(NULL); 会调用什么函数,如果这些函数可用的话:

void foo(int* param);
void foo(int param);

答案是依赖于实现[1],因为NULL 可能是0nullptr,所以这实际上是不可移植代码。

我还想补充一点,在您的示例中,根本不需要针对 NULL 进行测试,因为 if (root) 具有完全相同的效果。

[1] 来自当前标准工作草案(N4296 / 2014-11-19):

18.2 类型
[...]
3)宏NULL是本国际标准(4.10)中实现定义的C++空指针常量。194

4.10 指针转换
1) 空指针常量是值为零或 std::nullptr_t 类型的纯右值的整数文字 (2.13.2) .

【讨论】:

  • 你在“impelementation”上有一个错字,我还以为NULL实际上是#defined 为0,不是吗?
  • @AlejandroDíaz:感谢您的关注。它被定义为0,但至少在 c++11 中它可以是两者。我会在一分钟内添加标准中的引用。
【解决方案4】:

为什么不改用nullptr?这是小写类型安全的!

【讨论】:

    猜你喜欢
    • 2020-04-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-20
    • 1970-01-01
    相关资源
    最近更新 更多