2024-09-29
NULL
and nullptr
in C++
As part of some other things, this question popped up and I had to look up the difference between NULL
and nullptr
in C++. Here’s what I found:
-
So
nullptr
is a keyword introduced in C++11 to represent a null pointer. It is of typestd::nullptr_t
. -
NULL
is a preprocessor macro that is defined as0
or((void*)0)
. It is not guaranteed that it will always expand to 0 (based on the code I found). -
nullptr
is more type-safe and causes fewer bugs thanNULL
because it is of typestd::nullptr_t
and can be used in place of any pointer type unlikeNULL
which can type casted to int too./*===---- __stddef_null.h - Definition of NULL -----------------------------=== * * Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. * See https://llvm.org/LICENSE.txt for license information. * SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception * *===-----------------------------------------------------------------------=== */ #if !defined(NULL) || !__building_module(_Builtin_stddef) /* linux/stddef.h will define NULL to 0. glibc (and other) headers then define * __need_NULL and rely on stddef.h to redefine NULL to the correct value again. * Modules don't support redefining macros like that, but support that pattern * in the non-modules case. */ #undef NULL #ifdef __cplusplus #if !defined(__MINGW32__) && !defined(_MSC_VER) #define NULL __null #else #define NULL 0 #endif #else #define NULL ((void*)0) #endif #endif