猿问

对C ++中的指针使用NULL或0(零)吗?

对C ++中的指针使用NULL或0(零)吗?

在C ++的早期,当它被用螺栓固定在C之上时,你不能使用NULL,因为它被定义为(void*)0。你不能将NULL分配给除了之外的任何指针void*,这使得它变得毫无用处。在那些日子里,人们接受了你使用0(零)空指针。

直到今天,我继续使用零作为空指针,但我周围的人坚持使用NULL。我个人认为给NULL现有值的名称()没有任何好处- 因为我也喜欢将指针测试为真值:

if (p && !q)
  do_something();

然后使用零更有意义(如果你使用NULL,你不能逻辑使用p && !q- 你需要明确比较NULL,除非你假设NULL是零,在这种情况下为什么使用NULL)。

有没有客观的理由偏好零而不是NULL(反之亦然),或者只是个人偏好?

编辑:我应该添加(并且最初要说)使用RAII和异常,我很少使用零/ NULL指针,但有时你确实需要它们。


皈依舞
浏览 674回答 3
3回答

元芳怎么了

有一些论点(其中一个是相对较新的),我认为这与Bjarne的立场相矛盾。意图文件使用NULL允许搜索它的使用,它还强调开发人员想要使用NULL指针,无论编译器是否正在解释它NULL。指针和'int'的重载相对较少每个人引用的例子是:void foo(int*);void foo (int);void bar() {   foo (NULL);  // Calls 'foo(int)'}但是,至少在我看来,上面的问题并不是我们对空指针常量使用NULL,而是我们有'foo'的重载,它们采用了不同类型的参数。参数也必须是一个int,因为任何其他类型都会导致模糊调用,因此生成一个有用的编译器警告。分析工具可以帮助今天!即使在没有C ++ 0x的情况下,现在还有一些工具可以验证是否NULL用于指针,并且0用于整数类型。C ++ 11将有一个新std::nullptr_t类型。这是该表的最新参数。C ++ 0x 的问题0和NULL正在积极解决,你可以保证,对于提供的每个实现NULL,他们将要做的第一件事是:#define NULL  nullptr对于那些谁使用NULL,而不是0,这种变化将在很少或根本没有力气类型安全性的提高-如果有的话,还可以赶上他们已经使用了一些错误NULL的0。对于0今天使用的任何人......呃......希望他们对正则表达有很好的了解......

慕的地8271018

我很久以前就停止使用NULL(和大多数其他宏一样)。我这样做不仅是因为我想尽可能地避免使用宏,而且因为NULL似乎已经在C和C ++代码中被过度使用了。它似乎只在需要0值时使用,而不仅仅是指针。在新项目中,我将其放在项目标题中:static const int nullptr = 0;现在,当符合C ++ 0x的编译器到达时,我所要做的就是删除该行。这样做的一个很好的好处是Visual Studio已经将nullptr识别为关键字并适当地突出显示它。
随时随地看视频慕课网APP
我要回答