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;
}
是否有其他方法可以确定符合C标准的程序中 NULL
的类型? 在C89中有吗?
NULL
是void *
类型,那么char c = NULL;
会生成编译器警告(因此需要进行强制转换)。 - Jonathan Lefflernull_has_ptr_type
真的有效吗?在我的电脑上,它在两种情况下都返回0。 - md5s
是VLA,则会评估i ++
,否则不会评估。如果NULL是指针,那么s
将是VLA,如果是int,则不是。或者类似于这样... GCC在两种情况下会给出不同的警告。@ Kirilenko - Mat