在this answer中,sassman
使用以下内容初始化指针:
zend_class_entry* ce = 0L;
我的问题是 - 这有效吗?我会说它不是,用空指针初始化变量,或者是一个未经修饰的(并且可能被转换为
应使用void *
)0
常量或一些评估为NULL
的宏。
但是,我无法在支持此解释的标准中找到确定的语言。它只是说:
一个整数常量表达式,其值为0,或者这样的表达式强制转换为类型 void *,称为空指针常量。
答案 0 :(得分:8)
0L
是一个整数常量表达式,其值为零。当用作指针时,这样的常量表达式是空指针常量。这正是你引用的句子所说的(C99 6.3.2.3/3):
值为
0
的整型常量表达式,或者类型为void *
的表达式,称为空指针常量。
紧接着是一个声明,可以将空指针常量转换为空指针:
如果将空指针常量转换为指针类型,则保证将结果指针(称为空指针)与指向任何对象或函数的指针进行比较。
为什么你认为0
不能用作空指针常量?
答案 1 :(得分:2)
绝对具有零值的任何整数常量表达式将被编译器视为空指针常量。 0L
是一个完全有效的空指针常量,因此代码绝对有效。
答案 2 :(得分:-3)
您可以将所有内置POD类型设置为文字常量0而不进行强制转换。