C允许将NULL
定义为任何空指针常量,换句话说,任何计算结果为0的整型常量表达式,或转换为void *
的此类表达式。我的问题是定义的选择是否真的很重要,也就是说,一个原本正确的程序是否可能取决于所使用的定义。对于这个问题,我想忽略像NULL
被传递给可变函数或缺少原型的函数这样的问题,因为我已经单独处理过了。让我们假设某个整数类型T
的sizeof NULL == sizeof(void *)
和sizeof NULL == sizeof(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中工作的?
发布于 2013-06-19 18:20:24
通过问题、答案和评论,我认为我们已经建立了:
由于有due的compilers.
typedef
.
所以答案似乎是没有可靠的pre-C11方法,似乎也没有有效的pre-C99方法。
发布于 2013-01-10 00:06:18
获取NULL的字符串定义,然后根据需要执行完整的检查。这是一个非常简单的想法:
#define XSTR(x) #x
#define STR(x) XSTR(x)
if (STR(NULL)[0] == '(') {
...
}
但我不知道你将如何处理从那里出来的__null
。
发布于 2016-03-10 12:55:12
这里有一种晦涩难懂的方法:如果程序使用表达式&*NULL
,则不会使用具有整数类型的NULL
进行编译,但如果NULL
具有指针类型,则会进行编译。
对于这种特殊情况,C99有如下表述:
如果
&
运算符的操作数是一元*
运算符的结果,则既不计算该运算符,也不计算&
运算符,结果就好像两个运算符都被省略了一样,只是运算符的约束仍然适用,并且结果不是左值。
运算符的约束没有被违反:&
的操作数是一元*
运算符的结果,而一元*
运算符的操作数具有指针类型(正如我们假设NULL
是以这种方式定义的)。
https://stackoverflow.com/questions/14239969
复制相似问题