Do you use NULL or 0 (zero) for pointers in C++?
There are a few arguments (one of which is relatively recent) which I believe contradict Bjarne's position on this.
Documentation of intent
Using
NULL
allows for searches on its use and it also highlights that the developer wanted to use aNULL
pointer, irrespective of whether it is being interpreted by the compiler asNULL
or not.Overload of pointer and 'int' is relatively rare
The example that everybody quotes is:
void foo(int*); void foo (int); void bar() { foo (NULL); // Calls 'foo(int)' }
However, at least in my opinion, the problem with the above is not that we're using
NULL
for the null pointer constant: it's that we have overloads offoo()
which take very different kinds of arguments. The parameter must be anint
too, as any other type will result in an ambiguous call and so generate a helpful compiler warning.Analysis tools can help TODAY!
Even in the absence of C++0x, there are tools available today that verify that
NULL
is being used for pointers, and that0
is being used for integral types.C++ 11 will have a new
std::nullptr_t
type.This is the newest argument to the table. The problem of
0
andNULL
is being actively addressed for C++0x, and you can guarantee that for every implementation that providesNULL
, the very first thing that they will do is:#define NULL nullptr
For those who use
NULL
rather than0
, the change will be an improvement in type-safety with little or no effort - if anything it may also catch a few bugs where they've usedNULL
for0
. For anybody using0
today... well, hopefully they have a good knowledge of regular expressions...
Here's Stroustrup's take on this: C++ Style and Technique FAQ
In C++, the definition of
NULL
is 0, so there is only an aesthetic difference. I prefer to avoid macros, so I use 0. Another problem withNULL
is that people sometimes mistakenly believe that it is different from 0 and/or not an integer. In pre-standard code,NULL
was/is sometimes defined to something unsuitable and therefore had/has to be avoided. That's less common these days.If you have to name the null pointer, call it
nullptr
; that's what it's called in C++11. Then,nullptr
will be a keyword.
That said, don't sweat the small stuff.