NULL宏何时不等于0?

10 浏览
0 Comments

NULL宏何时不等于0?

我模糊地记得几年前读到过这个问题,但在网络上找不到任何相关参考。你能举一个NULL宏没有展开为0的例子吗?\n编辑以更清楚地说明:现在,它可以展开成((void *)0)(0)(0L)。然而,很久以前有一些被遗忘的架构不符合这一规定,NULL展开成了不同的地址。类似这样的例子:\n

#ifdef UNIVAC
     #define NULL (0xffff)
#endif

\n我正在寻找这样一台机器的例子。\n更新以解决问题:\n我在提问时并不是指当前标准的上下文,也不是为了用我不正确的术语来惹恼人们。然而,我对被接受的答案得出的结论感到满意:\n

后来的模型使用[blah],显然是为了迎合所有现有的编写不当的C代码,这些代码做出了错误的假设。

\n关于当前标准中空指针的讨论,请参考这个问题

0
0 Comments

在C编译器中,NULL宏可以展开为'((void *)0)'(但不一定如此)。然而,这种展开方式在C++编译器中是无效的。因此,需要找到一种解决方法。

解决方法可以参考C FAQ中有关空指针的整章内容。

0
0 Comments

过去,有一段时间,NULL宏的定义为((void*)0)或者其他一些特定于机器的方式,因为某些机器并不使用全0的位模式来表示NULL。某些平台(如CDC或Honeywell机器)在C90标准得到批准之前,NULL的位模式是不同的(即不是全0)。然而,在ISO/ANSI修正C90标准时,他们明确规定在源代码中,0是正确的NULL指针,而不论底层的位模式是什么。这个规定一直延续到了C11标准中(具体来说,可以参考C11 6.3.2.3 Pointers /4)。

0
0 Comments

在历史的一些机器上,NULL宏的值不为0。这些机器包括Prime 50系列、Data General的Eclipse MV系列、Honeywell-Bull的一些大型机、CDC Cyber 180系列、HP 3000系列和Symbolics Lisp Machine等。这些机器使用了不同的表示方法来表示指针,其中一些机器使用了非0的值作为空指针的表示。这导致在编写C代码时,不能假设NULL宏的值为0。在C标准中,NULL被定义为一个空指针常量,但并没有规定其具体的表示形式。因此,对于这些旧的机器,NULL宏的值可能不为0。然而,根据C标准,NULL宏在源代码中仍然是一个整数常量表达式,其值为0或者是一个(void *)类型的强制转换。因此,源代码中的NULL宏可能会被展开为一个非0的指针值,但不能假设其值为0xffff或其他任何特定的值。对于这些具有非0值的NULL宏,C代码可能会做出特殊处理,例如使用新的指令来判断空指针。总之,虽然C标准规定了NULL为一个空指针常量,但对于一些旧的机器,NULL宏的值可能不为0,需要特殊处理。

0