正如问题所述,我一直在使用NULL和false(在C++中)与0或0x0交替使用,依此类推.我很想知道除了是0的同义词之外他们是否有任何特殊意义.
对于某些平台NULL不是0x0
NULL保证为零,也许保证为(void *)1.
C99,§6.3.2.3,3
带有值的整型常量表达式
0或类型转换为类型的表达式void *称为空指针常量.(55)如果将空指针常量转换为指针类型,则保证结果指针(称为空指针)比较不等于指向任何对象或函数的指针.
注55说:
55)宏NULL在
<stddef.h>(和其他头部)中定义为空指针常量.
请注意,由于如何制定空指针的规则,用于分配/比较空指针的值保证为零,但实际存储在指针内的位模式可以是任何其他东西(但AFAIK只有少数很多)深奥的平台利用了这个事实,这不应该是一个问题,因为要"看到"你应该进入UB -land 的基础位模式无论如何).
因此,就标准而言,这两种形式是等价的(!ptr等同于ptr==0§6.5.3.35,ptr==0相当于ptr==NULL); if(!ptr)也是非常惯用的.
话虽如此,我通常会明确地编写,if(ptr==NULL)而不是if(!ptr)更清楚地表明我正在检查指针是否为null而不是某些布尔值.
void *中,由于更严格的隐式转换规则会导致使用这种NULL繁琐(您必须每次都明确地将其转换为比较指针的类型),因此无法使用强制转换.| 归档时间: |
|
| 查看次数: |
1511 次 |
| 最近记录: |