NULL宏何时不等于0?
NULL宏何时不等于0?
我模糊地记得几年前读到过这个问题,但在网络上找不到任何相关参考。你能举一个NULL宏没有展开为0的例子吗?\n编辑以更清楚地说明:现在,它可以展开成((void *)0)
、(0)
或(0L)
。然而,很久以前有一些被遗忘的架构不符合这一规定,NULL展开成了不同的地址。类似这样的例子:\n
#ifdef UNIVAC #define NULL (0xffff) #endif
\n我正在寻找这样一台机器的例子。\n更新以解决问题:\n我在提问时并不是指当前标准的上下文,也不是为了用我不正确的术语来惹恼人们。然而,我对被接受的答案得出的结论感到满意:\n
后来的模型使用[blah],显然是为了迎合所有现有的编写不当的C代码,这些代码做出了错误的假设。
\n关于当前标准中空指针的讨论,请参考这个问题。
在历史的一些机器上,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,需要特殊处理。