问题基于对亲回答sizeof NULL的讨论。
以下是标准的部分内容:
值为 0 的整数常量表达式,或转换为 type 的此类表达式
void *,称为空指针常量NULL扩展为实现定义的空指针常量
似乎并没有禁止#define NULL ((void*)0)简单地这样做#define NULL 0,就像专业人士所做的那样。然后结果证明它sizeof NULL等于sizeof (void*), 或sizeof (int)(在变体中sizeof 0)。
但是,来自莫斯科的@Vlad 指出C 中的 NULL 必须是指针。
NULL 在 C 中被定义为一个指针。
“cast to type void *”这句话在上面的引用中非常重要。
这里
или与类型转换无关,与表达式的形式有关。这就是 NULL 的定义方式。
那么C(没有加号)可以有吗?
#define NULL 0
如果是这样,为什么在编译器中使用它
#ifndef NULL
#ifdef __cplusplus
#define NULL 0
#else
#define NULL ((void *)0)
#endif
#endif
而不是两种语言都为零的更简单版本?
事实上,在 C 语言中,甚至没有函数重载,以至于某些东西可能会被破坏。
仔细观察 C 标准,我认为你是对的。空指针常量是值为 0 的整数常量表达式,或者是转换为 type 的表达式
void *。因此,宏的定义
NULL原则上可以不同,具体取决于编译器的实现。也就是说,在 C 标准的任何地方我都没有发现 NULL 宏必须定义为我查看了文档 Rationale for International Standard - Programming Languages - C 我发现了以下内容(7.17 通用定义)
由于空指针常量在表达式中被转换为空指针,并且大小
null pointer可能不等于任何整数类型的大小,因此将其定义为更null pointer constant方便也就是说,立即将其转换为指针类型。
在 C++ 中,这样的定义被放弃了,因为与 C 不同,在 C++ 中,由于类型安全,需要将指针显式转换
void为指向特定对象的指针的类型。也就是说,如果null pointer constantNULL它在 C++ 中定义为那么你必须做一个明确的指针转换,比如
这当然是非常繁重的。
因此,C++ 拒绝将
NULL整数常量声明为类型转换void *。