【问题标题】:C++ nil vs NULLC++ 零与 NULL
【发布时间】:2009-11-05 21:06:09
【问题描述】:

好的,我在头文件中有一些 C++ 代码,声明如下:

void StreamOut(FxStream *stream,const FxChar *name = nil);

我得到:错误:

'nil' was not declared in this scope

nil 是帕斯卡,对吗?

我应该使用 NULL 吗?

我认为它们都相同或至少为零,不是吗?

【问题讨论】:

  • 虽然它们都可能为零,但这并不一定意味着 NULL = nil。这取决于很多因素,例如 typedef 的完成方式、声明/定义的制作方式等。

标签: c++ null


【解决方案1】:

在 C++ 中你需要使用NULL, 0,或者在一些全新的编译器中使用 nullptr。在某些圈子中,NULL 与 0 的使用可能会引起一些争论,但恕我直言,NULL 是比 0 更受欢迎的用法。

【讨论】:

  • 澄清#DEFINE NULL 0null_ptr != NULL null_ptr 仅用于表示没有值的指针,0 是有效的指针值,但除非嵌入式系统,否则它可能是无效的。
  • 这是nullptr - channel9 有一些关于它的精彩视频:channel9.msdn.com/shows/Going+Deep/…
  • @joshperry,抱歉,您没有澄清,而是混淆了它。 0 不是指针值,而是整数值 - 不排除任何系统。它可以转换为指针值。见stackoverflow.com/questions/423823/…
  • 根据定义,指针上下文中的0 空指针。 c-faq.com/null/index.html
  • @Carl Norum,您使用的是不同的“是”定义。如果“A 可以转换为 B”,您是在说“A 是 B”。在将参数传递给函数时,该定义是有意义的。但对于大多数人(至少我会这么认为),is 在断章取义时意味着“是一回事”。所以这些人会认为0 既是一个整数又是一个指针,并且会认为如果你这样做ptr + 0(当然这是一个“指针上下文”)你可以添加一个指针和一个空指针等......最好保持清楚,并说“在需要时将 0 转换为空指针”。
【解决方案2】:

nil 在标准 C++ 中不存在。请改用NULL

【讨论】:

    【解决方案3】:

    是的。在CC++ 中是NULL,而在Objective-C 中是nil

    每种语言都有自己的标识符,没有对象。在C 标准库中,NULL((void *)0) 的类型定义。在C++ 标准库中,NULL00L 的typedef。

    但是恕我直言,您永远不应该使用 0 代替 NULL,因为它有助于代码的可读性,就像在代码中使用常量变量一样:不使用 NULL,值 0 也用于空指针作为循环中的基本索引值以及空列表的计数/大小,它使得更难知道哪个是哪个。此外,grep 等更容易。

    【讨论】:

    • IMO - 0 是一个整数值,NULL 表示一个指针。使用 0 让我怀疑程序员忘记了他们在做什么或者只是马虎。 sizeof(NULL) 也应该与 sizeof(void*) 相同。
    • 不在 C++ 中,这就是问题所在。在 C++ 中,NULL 是一个 整数,而不是指针。 sizeof(NULL) == sizeof(int)。我一直怀疑 Stroustrup 是故意这样做的,因为他从不喜欢 NULL,并且想让它在 C++ 中的使用比在 C 中更容易反对;-)
    • @NVRAM:“应该”?也许。但无论是在 c 中还是在 C++ 中,sizeof(NULL) 都不能保证与 sizeof(void *) 相同。
    • @onebyone: NULL 在 C++ 中是一个 整数,但不一定特别是 intNULL 可以定义为OL,这意味着在这种情况下sizeof(NULL) == sizeof(long)
    • @AndreyT:虽然我同意并且更喜欢在 C++ 中使用 0 而不是 NULL,但在 C 中,null 定义为 ((void*)0),就 C 而言,sizeof(NULL) 保证为 @987654343 @.
    【解决方案4】:

    0 是 C++ 推荐的常用样式

    【讨论】:

    • Stroustrup 不“推荐”它。它更像是 Stroustrup 的“个人偏好”。
    • 我什至不会说使用 0 很常见。我已经看到了它的代码,但常见的是拉伸它。不过 NULL 很常见。
    • “如果你必须命名空指针,就叫它 nullptr”对我来说听起来像是不使用 NULL 的建议(当然,空指针与空指针常量完全不同,但我认为很明显他在谈论应该使用什么文字来生成空指针)。事实上,这是一个直接命令,但鉴于他不是我的老板,我选择将其解释为建议;-)
    • +1 圭多。我更喜欢 0。如果程序员不理解他们正在评估的参数或 NULL 代表什么(不同),他们会遇到更大的问题。这是一个指针比较,它不需要涂上糖果或做得更复杂。如果我想要一个带标签的(明确的)类型,我将为它创建一个描述性常量。
    【解决方案5】:

    如果你通过 glibc 运行搜索,你会发现这行代码:

    #define NULL 0
    

    这只是标记空指针的标准方法(不确定它是否在任何地方发布)。变量值 0 仍然是一个值。指向 0(0x0000...(十进制零))的指针实际上没有指向任何地方。这只是为了便于阅读。

    int *var1, var2;
    var1 = 0;
    var2 = 0;
    

    以上两个任务虽然看起来一样,但并不相同

    【讨论】:

      【解决方案6】:

      只需在开头添加

      #define null '\0'
      

      或任何你想要的,而不是null,并坚持你喜欢的。 C++ 中的 null 概念仅与指向空的指针有关 (0x0)..

      请注意,每个编译器可能都有自己的 null、nil、NULL 等定义。但最终它仍然是 0。

      可能在您正在查看的源代码中有一个

      #define nil '\0'
      

      头文件中的某处..

      【讨论】:

      • 您已经定义了一个 char 常量,对于处理以空字符结尾的字符串很有用。 OP 代码期望 nil 是一个指针。
      • 实际上我一直在我的“common.h”头文件中使用它,编译器从来没有抱怨过,执行也没有。但也许有了 -Wall 它会说明这一点..
      • 实际上,将NULL 定义为\0 在C 和C++ 中是完全有效的。看到这样的实现我会很惊讶,但\0 是定义NULL 的有效方式。
      • 2.13.2/4 中的 C++ 证明,其中说“转义 \ooo ... [is] 用于指定所需字符的值”。所以\0 的值为零,是 NULL 的有效值。我不确定 false 是否适用于 C++:它的值是 ... false 而不是零,要变为零,您需要提升为 int 或转换为另一种整数类型。但这需要整数和指针转换 - 所以它会变得非法。但尽管如此,我尝试了各种实现,它们都接受false
      【解决方案7】:

      我看到了一些关于为什么不使用 0 的 cmets。通常人们不喜欢幻数,或者背后有含义的数字。给他们一个名字。我宁愿在代码中看到 ANSWER_TO_THE_ULTIMATE_QUESTION 超过 42。

      至于 nil,我知道 Obj-C 也使用 nil。我不愿意认为有人违反了非常流行的 NULL 约定(或者至少是我记得的),我认为它在某个标准库头文件中。不过我已经有一段时间没学过 C++了。

      【讨论】:

      • 就我个人而言,我认为 0 是如此神奇,以至于假装你的意思是某种特殊的 0 毫无意义。当然,你可以说 INTEGER_THAT_CONVERTS_TO_NULL_POINTER(即 NULL 是什么),或者你可以说 DEFAULT_INITIAL_VALUE_OF_A_GLOBAL_INT_VARIABLE,或 INDEX_OF_FIRST_OBJECT_IN_AN_ARRAY。但是每个人都知道你的意思是 0,并在他们的脑海中翻译为 0。我曾经谨慎地使用 NULL,我并不反对它,但我倾向于坚持使用 0。'\0' 也是如此,尽管我认为 ASCII_NUL 宏至少与 NULL 一样有用。
      猜你喜欢
      • 2020-07-15
      • 1970-01-01
      • 2012-04-11
      • 2020-07-31
      • 2016-04-10
      • 1970-01-01
      • 2021-10-01
      • 2010-10-08
      • 2012-10-17
      相关资源
      最近更新 更多