NULL
来自cppreference.com
定义于头文件 <clocale>
|
||
定义于头文件 <cstddef>
|
||
定义于头文件 <cstdio>
|
||
定义于头文件 <cstdlib>
|
||
定义于头文件 <cstring>
|
||
定义于头文件 <ctime>
|
||
定义于头文件 <cwchar>
|
||
#define NULL /*implementation-defined*/ |
||
宏 NULL
是实现定义的空指针常量,可为
(C++11 前) | |
零值整数字面量,或为 std::nullptr_t 类型纯右值 |
(C++11 起) |
空指针常量可以隐式转换为任何指针类型;这种转换结果是该类型的空指针值。若空指针常量拥有整数类型,它亦可转换为 std::nullptr_t 类型纯右值。
可能的实现
#define NULL 0 // C++11 起 #define NULL nullptr |
注解
C 中,宏 NULL
可以拥有类型 void* ,但这在 C++ 中不允许。
一些实现定义 NULL
为拥有下列属性的编译器扩展 __null
:
-
__null
等价于零值的整数字面量(从而与 C++ 标准兼容)并拥有与 void* 相同的大小,例如它在 ILP32/LP64 平台上分别等价于 0/0L ; - 从
__null
到算术类型,包括__null
自身的类型的转换,可能触发警告。
示例
运行此代码
#include <cstddef> #include <type_traits> #include <iostream> class S; int main() { int* p = NULL; int* p2 = static_cast<std::nullptr_t>(NULL); void(*f)(int) = NULL; int S::*mp = NULL; void(S::*mfp)(int) = NULL; auto nullvar = NULL; // 以 gcc/clang 编译时可以触发警告 if constexpr(std::is_same_v<decltype(NULL), std::nullptr_t>) { std::cout << "NULL implemented with type std::nullptr_t\n"; } else { std::cout << "NULL implemented using an integral type\n"; } [](auto...){}(p, p2, f, mp, mfp, nullvar); //< 垃圾“未使用”值 }
可能的输出:
NULL implemented using an integral type
缺陷报告
下列更改行为的缺陷报告追溯地应用于以前出版的 C++ 标准。
DR | 应用于 | 出版时的行为 | 正确行为 |
---|---|---|---|
CWG 903 | C++11 | 曾允许零值的表达式,如 1-1 | 只允许字面的零 |
参阅
nullptr(C++11) | 指定空指针值的指针字面量 |
(C++11) |
空指针字面量 nullptr 的类型 (typedef) |