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