为什么NULL不是由编译器预定义的

std*_*all 5 c

这个问题困扰了我一段时间.我从来没有看到过NULL的不同定义,它始终是

#define NULL  ((void *) 0)
Run Code Online (Sandbox Code Playgroud)

是否有任何体系结构,其中NULL定义不同,如果是这样,为什么编译器不为我们声明这个?

Joh*_*ode 4

C 2011 标准,在线草案

\n\n
\n 6.3.2.3 指针
\n...
\n3 值为 0 的整型常量表达式或转换为类型\n 的此类表达式void *称为空指针常量66)如果将空指针常量转换为\n指针类型,则生成的指针(称为空指针)保证与指向任何对象或函数的指针比较不相等。\n
\n 66) 该宏NULL在(和其他标头)中被 de\xef\xac\x81ned<stddef.h>作为空指针常量;见 7.19。\n
\n\n

始终定义为零值常量表达式 它可以是裸露的 0,或 0 转换为,或其他计算结果为 0 的整数表达式。就您的源代码而言,将始终计算为 0。 NULLvoid *NULL

\n\n

一旦代码被翻译,任何出现的空指针常量(0、NULL等)都将被替换为底层体系结构用于空指针的任何内容,该空指针可能是也可能不是 0 值。

\n