【问题标题】:Whats better to use in C++11 , Zero or NULL?在 C++11 中使用什么更好,零或 NULL?
【发布时间】:2012-10-17 00:10:08
【问题描述】:

现在,使用 C++11,推荐使用什么,ZeroNULL?第二个if中的第一个?

int * p = getPointer();

if( 0 == p ){
    // something
}

if( NULL == p ){
    // something
}

更新:我忘记了新的

if( nullptr == p ){
    // something
}

UPDATE 2:示例是显示写入空指针的选项,我知道写if( !p ) 会更愉快。

【问题讨论】:

  • Yoda Conditions 看起来很有趣!
  • 记住 null 和 0 之间的区别... 0 是一个整数,其中 null 表示“无” - 因此您应该使用 nullptr(以及为什么 0ptr 不存在)
  • @VBAssassin: 0 作为文字是一种特殊的野兽,因为它既是整数又是转换为空指针的“东西”。当用作指针时,0 空指针。请注意,在 C++ 中将 NULL 定义为文字 0(整数类型),这与在 C 中为 (void*)0 不同。当然,在 C++11 中更好的选择是 nullptr,但在 C++03 中,我更喜欢 0 而不是 NULL

标签: c++ pointers c++11


【解决方案1】:

不是,是nullptr

不过,在你的情况下,我会选择

if ( !p ){
   //something
}

2.14.7 指针字面量 [lex.nullptr]

1 指针文字是关键字nullptr。它是std::nullptr_t 类型的纯右值。 [注:std::nullptr_t 是一个独特的类型,既不是指针类型也不是指向成员类型的指针;相反,这种类型的prvalue是 空指针常量,可以转换为空指针值或空成员指针值。

【讨论】:

  • 你的情况相反。这就是为什么我认为最好写p == nullprtp != nullptr
  • +1 在谷歌搜索 nullptr 的实际含义后 :) 这对我来说是一个新的,但一个非常有用的。
  • +1 表示!p。我发现 if(p)if(!p) 比那些冗长的替代品更容易阅读。
  • if (p) 不能用于检查指针是否不为空。因为它转换为布尔值,因此可能会丢失宝贵的最重要的位。只有当你被微软的编译行为污染时,你才会这么说,微软的编译行为会检测布尔上下文并生成!= 0 OPCODE。
  • @v.oddou:这根本不是问题,无论是否发生了对bool 的实际转换(它没有)。 Per the C++ standard on bool conversions:“算术纯右值、无作用域枚举、指针或指向成员类型的指针可以转换为 bool 类型的纯右值。零值、空指针值或空成员指针值转换为false;任何其他值都将转换为 true。" (强调)C++ 遵循 C 的行为;大多数测试关心 0/非零、NULL/非 NULL,而不是 truefalse
【解决方案2】:

其他答案是正确的。但我想多说一点为什么nullptr更好。

在 C++11 中,“完美转发”非常重要。它无处不在。明显的地方是bindfunction。但它也被用于许多其他地方。但是“完美转发”并不完美。它失败的地方之一是空指针常量。

template <class T>
void display(T)
{
    std::cout << type_name<T>() << '\n';
}

template <class T>
void
f(T&& t)
{
    display(std::forward<T>(t));  // "perfectly forward" T
}

int main()
{
    f(0);
    f(NULL);
    f(nullptr);
}

使用适当的type_name&lt;T&gt;() 定义,在我的系统上会打印出来:

int
long
std::nullptr_t

这很容易区分工作代码和错误。运气好的话,您的错误将在编译时出现(带有可怕的错误消息)。但在某些情况下,您也可能会遇到运行时错误。

严格禁止在代码中使用 0 和 NULL。

即使您在代码中没有完美的转发,您调用的代码(例如 std::lib)也很可能在幕后使用它。

【讨论】:

  • 谢谢。我以前总是写 0(我被 Stroustop 的书说服了),NULL 在我看来像是红鲱鱼,但现在仍然在多个地方看到。我现在会习惯写 nullptr。
  • 请注意,GCC 可以选择使用 -Wzero-as-null-pointer-constant 进行警告。 “当文字 '0' 用作空指针常量时发出警告。这有助于在 C++11 中转换为 nullptr。” gcc.gnu.org/onlinedocs/gcc/Warning-Options.html
  • 但是在现代 C++ 实现中NULL is defined as nullptr,不是吗?那为什么明确的nullptrNULL 好?或者这个答案可能已经过时了?
【解决方案3】:

C++11 有一个新的文字关键字nullptr。对于这样的事情,它比 0NULL 要好,因为它不可能在重载决议中用作 int

if ( nullptr == p )

当然,你也可以在 bool 上下文中使用指针:

if ( !p )

【讨论】:

    【解决方案4】:

    如果您在 2019 年遇到同样的问题,您正在使用较旧的初始化样式来处理未分配的指针。 2014 年 8 月 14 日之后,C++ 11 发布。您使用的编译器可能遵循 C++11 标准。

    您可以将0/NULL 替换为nullptr

    现代 C++ 提供nullptr 作为通用空指针。您应该使用它而不是 0 || NULL,因为有些晦涩的机器具有带符号指针之类的东西,其中空指针实际上是 -1 而不是 0。

    【讨论】:

      猜你喜欢
      • 2017-05-16
      • 2013-06-12
      • 1970-01-01
      • 1970-01-01
      • 2017-04-27
      • 1970-01-01
      • 2017-01-23
      • 2011-01-22
      • 2020-04-07
      相关资源
      最近更新 更多