NULL宏或NULL const

sim*_*mon 14 c++ null-pointer

我目前正在阅读一本关于C++的书,在本书中,作者解释说使用常量而不是NULL宏更好,但没有真正解释为什么或给出任何优点或缺点.

那么为什么最好使用:

const int NULL = 0;
int *ptr = NULL;
Run Code Online (Sandbox Code Playgroud)

代替:

int *ptr = NULL;
Run Code Online (Sandbox Code Playgroud)

唯一的解释是NULL宏不是类型安全的.

Bat*_*eba 38

一切都过时了.

nullptr改用.对于没有指向任何东西的指针,这是一个特殊值.它甚至有自己的类型,std::nullptr_t.

不能保证地址0x0对应于"未初始化"指针值,但请注意,文字0保证转换为空指针值.

  • 呃...什么?文字"0"仍然保证隐式转换为空指针. (20认同)
  • 但是有一个保证`ptr = 0;`将指针'ptr`分配给平台适当的空值. (6认同)
  • @hvd只有它是一个整数类型的编译时常量表达式(它不是`const int`全局对象,即使用文字`0`初始化它也不行.) (4认同)
  • @TheParamagneticCroissant两个都错了.`const int`全局对象*是初始化器可见的上下文中的编译时常量表达式,可以在常量表达式足够的上下文中使用(例如模板参数),但尽管如此,不是null指针常量,因为规则不再是必须是整数类型的编译时常量表达式,其值为零,而是文字"0". (4认同)
  • @hvd*文字"0"仍然保证隐式转换为空指针.*我会说它是*explicit*,给定**4.10指针转换**:"A*空指针常量*是一个整数常量表达式求值为零的整数类型的prvalue或类型为`std :: nullptr_t`的prvalue." (2认同)
  • @AndrewHenle嘿,是的,标准是明确的.那不是我要表达的意思.我在谈论隐式转换和显式转换.:) (2认同)

Man*_*lva 22

如果您使用的是C++ 11,那么建议使用它nullptr而不是NULL.

下面是Bjarne Stroustrup的C++编程语言中的几行

  • 在较旧的代码中,通常使用0或NULL而不是nullptr(第7.2.2节).但是,使用nullptr消除了整数(例如0或NULL)和指针(例如nullptr)之间的潜在混淆.
  • 在不同的实现中,NULL的定义存在差异; 例如,NULL可能是0或0L.在C中,NULL通常是(void*)0,这使得它在C++(第7.2.1节)中是非法的:
  • 使用nullptr使代码比替代方案更具可读性,并避免在函数重载以接受指针或整数时可能产生的混淆

我希望这能帮助你理解.