C 允许NULL
定义为任何空指针常量,换句话说,任何计算结果为 0 的整数常量表达式,或这样的表达式转换为void *
。我的问题涉及定义的选择是否真的很重要,即是否正确的程序可能取决于使用的定义。出于这个问题的目的,我想忽略诸如NULL
传递给可变参数函数或缺少原型的函数之类的问题,因为我已经单独处理了它。让我们假设sizeof NULL == sizeof(void *)
和sizeof NULL == sizeof(T)
对于一些整数类型T
,所以这sizeof
不足以回答是否NULL
有指针类型的问题。
显然,C11 提供了一种区分类型NULL
或任何其他表达式的方法:_Generic
关键字。
C99 还提供了一种看似可靠的晦涩方式:
int null_has_ptr_type()
{
char s[1][1+(int)NULL];
int i = 0;
return sizeof s[i++], i;
}
是否有任何其他方法NULL
可以由符合标准的 C 程序确定类型?在 C89 中可以使用吗?