I'll start off with this: consistency is king, the decision is less important than the consistency in your code base.
In C++
NULL is defined as 0 or 0L in C++.
If you've read The C++ Programming Language Bjarne Stroustrup suggests using 0
explicitly to avoid the NULL
macro when doing assignment, I'm not sure if he did the same with comparisons, it's been a while since I read the book, I think he just did if(some_ptr)
without an explicit comparison but I am fuzzy on that.
The reason for this is that the NULL
macro is deceptive (as nearly all macros are) it is actually 0
literal, not a unique type as the name suggests it might be. Avoiding macros is one of the general guidelines in C++. On the other hand, 0
looks like an integer and it is not when compared to or assigned to pointers. Personally I could go either way, but typically I skip the explicit comparison (though some people dislike this which is probably why you have a contributor suggesting a change anyway).
Regardless of personal feelings this is largely a choice of least evil as there isn't one right method.
This is clear and a common idiom and I prefer it, there is no chance of accidentally assigning a value during the comparison and it reads clearly:
if(some_ptr){;}
This is clear if you know that some_ptr
is a pointer type, but it may also look like an integer comparison:
if(some_ptr != 0){;}
This is clear-ish, in common cases it makes sense... But it's a leaky abstraction, NULL
is actually 0
literal and could end up being misused easily:
if(some_ptr != NULL){;}
C++0x has nullptr which is now the preferred method as it is explicit and accurate, just be careful about accidental assignment:
if(some_ptr != nullptr){;}
Until you are able to migrate to C++0x I would argue it's a waste of time worrying about which of these methods you use, they are all insufficient which is why nullptr was invented (along with generic programming issues which came up with perfect forwarding.) The most important thing is to maintain consistency.
In C
C is a different beast.
In C NULL can be defined as 0 or as ((void *)0), C99 allows for implementation defined null pointer constants. So it actually comes down to the implementation's definition of NULL and you will have to inspect it in your standard library.
Macros are very common and in general they are used a lot to make up for deficiencies in generic programming support in the language and other things as well. The language is much simpler and reliance on the pre-processor more common.
From this perspective I'd probably recommend using the NULL
macro definition in C.