В C++ NULL расширяется до 0 или 0L. См. этот комментарий от Страуструпа:
Должен ли я использовать NULL или 0? В C++ определение NULL равно 0, поэтому только эстетическая разница. я предпочитаю чтобы избежать макросов, поэтому я использую 0. Другой проблема с NULL в том, что люди иногда ошибочно полагают, что это отличен от 0 и/или не является целое число. В предварительно стандартном коде NULL был / иногда определяется чем-то неподходящий и, следовательно, должен был/должен быть избегали. Это менее распространено дней.
Если вам нужно назвать нулевой указатель, назовите это nullptr; вот что это будет вызываться в C++0x. Потом, «nullptr» будет ключевым словом.
Я никогда не использую NULL в своем коде C или C++. 0
прекрасно работает, как и if (имя_изображения)
. Любой компетентный программист на C или C++ должен знать, что они делают.
Недостаток NULL в C++ заключается в том, что это определение для 0. Это значение может быть незаметно преобразовано в указатель, логическое значение, float/double или внутр.
Это не очень безопасно для типов и привело к реальным ошибкам в приложении, над которым я работал.
Учтите следующее:
void Foo(int i);
void Foo(Bar* b);
void Foo(bool b);
main()
{
Foo(0);
Foo(NULL); // same as Foo(0)
}
C++11 определяет nullptr
, который может быть преобразован в нулевой указатель, но не в другие скаляры. Это поддерживается во всех современных компиляторах C++, включая VC++ 2008 года. В старых версиях GCC есть похожая функция, но тогда она называлась __null
.
Предполагая, что у вас нет библиотеки или системного заголовка, определяющего NULL
, как, например, (void*)0
или ( char*)0
все в порядке. Я всегда предпочитаю использовать 0, так как это по определению нулевой указатель. В c++0x у вас будет nullptr
, так что этот вопрос больше не будет иметь большого значения.
From crtdbg.h (и многих других заголовков):
#ifndef NULL
#ifdef __cplusplus
#define NULL 0
#else
#define NULL ((void *)0)
#endif
#endif
Поэтому NULL
— это 0
, по крайней мере, на платформе Windows. Так что нет, не то, что я знаю.