#define NULL implementation-defined
概要
マクロNULLは、処理系定義のヌルポインタ定数に展開される。
ヌルポインタ定数は、ポインタがいかなるオブジェクトも指し示さないことを表現するために使われる。
マクロNULLは、以下の標準ヘッダにおいて定義される:
<clocale><cstddef><cstdio><cstdlib><cstring><ctime><cwchar>
例
#include <cstddef>
int main() {
int* p = NULL;
delete p;
}
備考
- マクロ
NULLが展開されるヌルポインタ定数はリテラルであることが規定されている。したがってnullptr、0、0Lは規格に適合するが、(void*)0は適合しない。 - C++98において、「ヌルポインタ定数」は「値が0になる整数定数式」と定義されていた。したがって、マクロ
NULLの値として0や0Lは規格に適合するが、(void*)0は整数定数式ではないため適合しない。 - C++11では、「ヌルポインタ定数」の定義に「
std::nullptr_t型のprvalue」が追加されたため、nullptrも規格に適合する。しかし、NULLの値の型が変わるとコードの互換性を損なうことから、当面の間NULLの値は整数定数式であると思われる。C++11以降はNULLではなくnullptrを使用するとよい。
関連項目
参照
- Does any major C++ implementation actually define
NULLasnullptr? - Stack Overflow - LWG Issue 4182. Definition of
NULLis too broadNULLが展開されるヌルポインタ定数はリテラルであることが規定された。それ以前は「処理系定義のヌルポインタ定数」としか規定されておらず、任意の定数式を許すように読めたため。規格としてはC++29のワーキングドラフトへ適用されたが、処理系に対する制約の明文化であり、既存の処理系はいずれも満たしているため、C++98へ遡及して適用される