R..*_*R.. 16 c language-lawyer
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;
}
Run Code Online (Sandbox Code Playgroud)
是否有其他方法NULL可以通过符合C的程序确定类型?任何在C89工作的人?
通过问题,答案和评论,我认为我们建立了:
_Generic).typedef.所以答案似乎是没有可靠的前C11方法,而且看似没有有效的前C99方法.