我隐约记得几年前读过这篇文章,但我在网上找不到任何参考.
你能给我一个NULL宏没有扩展到0的例子吗?
编辑清晰:今天,它扩展为((void *)0),(0)或(0L).但是,有些架构早已被遗忘,而这种情况并非如此,并且NULL扩展到了不同的地址.就像是
#ifdef UNIVAC
#define NULL (0xffff)
#endif
Run Code Online (Sandbox Code Playgroud)
我正在寻找这样一台机器的例子.
更新以解决问题:
我不是在现行标准的背景下提出这个问题,也不是用不正确的术语来扰乱人们.但是,我接受的答案证实了我的假设:
后来的模型使用了[blah],显然是对所有现存的写得不好的C代码的反应,这些代码做出了错误的假设.
有关当前标准中的空指针的讨论,请参阅此问题.
我倾向于使用逻辑否定运算符编写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 友好什么是务实的(如果有的话),否则写这个的好处是什么?
编译器升级后,我遇到了新的警告消息。
警告:整数为零的指针的有序比较[-Wextra]
Run Code Online (Sandbox Code Playgroud)if (inx > 0)
事实证明inx是一个指针。通常,我希望看到这个旧代码与0或NULL进行比较。这使我考虑了有符号和无符号的值以及可能的风险。
一些研究表明:
这些似乎表明一个地址(由malloc返回)永远不能为零。
这将我带到了标准的旧版本。
4.10指针转换
1空指针常量是整数类型的整数常量表达式(5.19)prvalue,其值为零或std :: nullptr_t类型的prvalue。空指针常量可以转换为指针类型。结果是该类型的空指针值,并且可以与指向对象或函数类型的指针的所有其他值区分开。这种转换称为空指针转换。相同类型的两个空指针值应比较相等。空指针常量到cv限定类型的指针的转换是一次转换,而不是指针转换后跟有资格转换的序列(4.4)。整数类型的空指针常量可以转换为std :: nullptr_t类型的prvalue。
它特别指出两个空指针比较相等。
考虑到这一点,那小段代码是未定义的行为吗?还是我想念的难题还有另外一块?