可以使用0L初始化C ++中的指针导致问题吗?

时间:2009-12-15 14:44:26

标签: c++ pointers null-pointer

this question中,初始化器用于将指针设置为null。不使用00L而是使用值。我已经读过,对于空指针应该使用0,因为精确的空指针表示是特定于实现的。

使用0L设置指向null的指针会导致移植时出现问题吗?

9 个答案:

答案 0 :(得分:16)

从标准(4.10.1):

  

空指针常量是一个整数   常数表达式(5.19)的左值   求值为零的整数类型

所以我猜0L没问题。

答案 1 :(得分:13)

我认为0L很好,除非它意味着你认为你指定的指针类型与长整数相同,所以有点令人困惑。

我认为使用NULL要清楚得多。

答案 2 :(得分:4)

在C ++ 0x中,有一个名为nullptr的新空指针常量nullptr_t。它可以隐式转换为任何指针类型。

在那之前,我建议使用NULL,但是0和0L都可以用于我听过的每个实现。

答案 3 :(得分:3)

我不能给你一个确切的答案,但无论你的问题的确切答案是什么,只是用0L初始化指针的想法本身是错误的,因为它表明指针是与long相同的大小,当然不一定是真的。

编译器是否接受它,以及它是否安全,我不会这样做,因为它暗示了一个无效的想法。

答案 4 :(得分:2)

空指针表示是特定于实现的,但0和0L都不一定是该实现 - 它们只是用户可以指定空指针的方式,而且都可以。

我应该指出,Bjarne Stroustrup曾多次表示他的偏好是使用普通0(而不是NULL)。

答案 5 :(得分:2)

我不同意那些建议使用NULL的人,尽管三个陈述的选项中的任何一个确实可行。在惯用的C ++中,标准选择是0(也许是因为Stroustrup的偏好:http://www2.research.att.com/~bs/bs_faq2.html#null)。

0L将以与0相同的方式隐式地转换为适当的指针类型;它只是看起来有点奇怪,并没有真正理解Jesper给出的理由......

答案 6 :(得分:2)

您可以使用false00l0L0ul0u00或任何表示字面零的方法的数量。文字零基本上是一个神奇的符号,恰好也对应于空指针常量。

如果我们讨论的是一个恰好为零的值并且代码在指针上记忆它,那么我们就会遇到上面提到的问题。

额外问题:哪些类型的空指针常量不是按位零?

答案 7 :(得分:1)

我必须同意所有说NULL的人。对于那些喜欢使用0的人,我的观点是你的代码应该说出它意味着什么。你想要的结果是一个空指针,所以你的代码应该这样说。进行比较时更有意义:

if (some_variable == NULL) { ... }

更清晰
if (some_variable == 0) { ... }

答案 8 :(得分:-2)

将0L(长整数(64位))分配给32位指针可能会导致问题。与上面提到的其他帖子一样,使用NULL将指针初始化为零。