相关疑难解决方法(0)

什么时候NULL宏不是0?

我隐约记得几年前读过这篇文章,但我在网上找不到任何参考.

你能给我一个NULL宏没有扩展到0的例子吗?

编辑清晰:今天,它扩展为((void *)0),(0)(0L).但是,有些架构早已被遗忘,而这种情况并非如此,并且NULL扩展到了不同的地址.就像是

#ifdef UNIVAC
     #define NULL (0xffff)
#endif
Run Code Online (Sandbox Code Playgroud)

我正在寻找这样一台机器的例子.

更新以解决问题:

我不是在现行标准的背景下提出这个问题,也不是用不正确的术语来扰乱人们.但是,我接受的答案证实了我的假设:

后来的模型使用了[blah],显然是对所有现存的写得不好的C代码的反应,这些代码做出了错误的假设.

有关当前标准中的空指针的讨论,请参阅此问题.

c macros null history

33
推荐指数
2
解决办法
1万
查看次数

是否有一个实用的理由使用"if(0 == p)"而不是"if(!p)"?

我倾向于使用逻辑否定运算符编写if语句:

if (!p)
    some_code();
Run Code Online (Sandbox Code Playgroud)

我周围的一些人倾向于使用显式比较,因此代码看起来像:

if (FOO == p)
    some_code();
Run Code Online (Sandbox Code Playgroud)

其中FOO是一个,FALSE,0,0.0,NULL,等

我更喜欢简短形式,因为它是:

  • operator!= 友好
  • generic programming 友好
  • 简洁(对我来说更美丽)

什么是务实的(如果有的话),否则写这个的好处是什么?

c++ coding-style

21
推荐指数
4
解决办法
3715
查看次数

无效* p ...; if(p> 0)....这是未定义的行为吗?

编译器升级后,我遇到了新的警告消息。

警告:整数为零的指针的有序比较[-Wextra]

    if (inx > 0)
Run Code Online (Sandbox Code Playgroud)

事实证明inx是一个指针。通常,我希望看到这个旧代码与0或NULL进行比较。这使我考虑了有符号和无符号的值以及可能的风险。

一些研究表明:

这些似乎表明一个地址(由malloc返回)永远不能为零。

这将我带到了标准的旧版本。

4.10指针转换

1空指针常量是整数类型的整数常量表达式(5.19)prvalue,其值为零或std :: nullptr_t类型的prvalue。空指针常量可以转换为指针类型。结果是该类型的空指针值,并且可以与指向对象或函数类型的指针的所有其他值区分开。这种转换称为空指针转换。相同类型的两个空指针值应比较相等。空指针常量到cv限定类型的指针的转换是一次转换,而不是指针转换后跟有资格转换的序列(4.4)。整数类型的空指针常量可以转换为std :: nullptr_t类型的prvalue。

它特别指出两个空指针比较相等。

考虑到这一点,那小段代码是未定义的行为吗?还是我想念的难题还有另外一块?

c++ pointers

2
推荐指数
1
解决办法
1199
查看次数

标签 统计

c++ ×2

c ×1

coding-style ×1

history ×1

macros ×1

null ×1

pointers ×1