在这里快速提问,我不是在大写中输入 NULL 的忠实粉丝,我想知道我是否可以定义小写< / em>版本。
当我尝试在头文件中将其定义为:
#define null NULL;
它允许编译这一行,但如果我尝试在我的代码中的任何地方调用 null ,我会收到语法错误。
例如,如果我写:
if(root == null){ /* Code here */}
Eclipse告诉我这是一个语法错误,如果我尝试构建我的项目,我会收到此错误:
NULL 是一个特殊情况,我不允许这样做,或者我做错了什么?
答案 0 :(得分:10)
如果您使用的是C ++ 11编译器,请使用nullptr
,而不必担心#define
。
如果您必须使用#define
,请从该行中删除;
。
#define null NULL
答案 1 :(得分:5)
该行末尾的分号是错误的。正确的
#define null NULL
答案 2 :(得分:4)
正如其他答案已经说明的那样,您的错误是写#define null NULL;
而不是#define null NULL
。如果您想完全定义null
,您应该将其实际定义为nullptr
。试想一下,如果这些功能可用,foo(NULL);
会调用什么:
void foo(int* param);
void foo(int param);
答案是 依赖于实现 [1],因为NULL
可能是0
或nullptr
,所以这是实际上 非便携式 代码。
我还想补充一点,在你的例子中根本不需要对NULL进行测试,因为if (root)
具有完全相同的效果。
[1]从目前的标准工作草案(N4296 / 2014-11-19):
18.2类型
[...]
3)宏NULL是本国际标准(4.10)中实现定义的C ++空指针常量.194
和
4.10指针转换
1)空指针常量是一个整数文字(2.13.2),其值为零或者是一个类型为std :: nullptr_t的prvalue
答案 3 :(得分:2)
为什么不使用nullptr
?这是小写的和类型安全!