首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >程序可能检测NULL是定义为整数类型还是指针类型的方式?

程序可能检测NULL是定义为整数类型还是指针类型的方式?
EN

Stack Overflow用户
提问于 2013-01-09 23:46:08
回答 3查看 1.2K关注 0票数 16

C允许将NULL定义为任何空指针常量,换句话说,任何计算结果为0的整型常量表达式,或转换为void *的此类表达式。我的问题是定义的选择是否真的很重要,也就是说,一个原本正确的程序是否可能取决于所使用的定义。对于这个问题,我想忽略像NULL被传递给可变函数或缺少原型的函数这样的问题,因为我已经单独处理过了。让我们假设某个整数类型Tsizeof NULL == sizeof(void *)sizeof NULL == sizeof(T),因此sizeof不足以回答NULL是否具有指针类型的问题。

显然,C11提供了一种方法来区分NULL或任何其他表达式的类型:_Generic关键字。

C99还提供了一种看似可靠的晦涩方式:

代码语言:javascript
复制
int null_has_ptr_type()
{
    char s[1][1+(int)NULL];
    int i = 0;
    return sizeof s[i++], i;
}

是否有其他方法可以由符合要求的C程序来确定NULL的类型?有没有能在C89中工作的?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-06-19 18:20:24

通过问题、答案和评论,我认为我们已经建立了:

由于有due的compilers.

  • Stringifying方法是死胡同,typedef.

  • No发现了其他方法,因此
  1. C11 way很容易C99 way相当不可靠。

所以答案似乎是没有可靠的pre-C11方法,似乎也没有有效的pre-C99方法。

票数 6
EN

Stack Overflow用户

发布于 2013-01-10 00:06:18

获取NULL的字符串定义,然后根据需要执行完整的检查。这是一个非常简单的想法:

代码语言:javascript
复制
#define XSTR(x) #x
#define STR(x) XSTR(x)

if (STR(NULL)[0] == '(') {
   ...
}

但我不知道你将如何处理从那里出来的__null

票数 4
EN

Stack Overflow用户

发布于 2016-03-10 12:55:12

这里有一种晦涩难懂的方法:如果程序使用表达式&*NULL,则不会使用具有整数类型的NULL进行编译,但如果NULL具有指针类型,则会进行编译。

对于这种特殊情况,C99有如下表述:

如果&运算符的操作数是一元*运算符的结果,则既不计算该运算符,也不计算&运算符,结果就好像两个运算符都被省略了一样,只是运算符的约束仍然适用,并且结果不是左值。

运算符的约束没有被违反:&的操作数是一元*运算符的结果,而一元*运算符的操作数具有指针类型(正如我们假设NULL是以这种方式定义的)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14239969

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档