Использование NULL в C ++? [duplicate]

35
задан Community 23 May 2017 в 10:30
поделиться

5 ответов

В C++ NULL расширяется до 0 или 0L. См. этот комментарий от Страуструпа:

Должен ли я использовать NULL или 0? В C++ определение NULL равно 0, поэтому только эстетическая разница. я предпочитаю чтобы избежать макросов, поэтому я использую 0. Другой проблема с NULL в том, что люди иногда ошибочно полагают, что это отличен от 0 и/или не является целое число. В предварительно стандартном коде NULL был / иногда определяется чем-то неподходящий и, следовательно, должен был/должен быть избегали. Это менее распространено дней.

Если вам нужно назвать нулевой указатель, назовите это nullptr; вот что это будет вызываться в C++0x. Потом, «nullptr» будет ключевым словом.

38
ответ дан 27 November 2019 в 07:11
поделиться

Я никогда не использую NULL в своем коде C или C++. 0 прекрасно работает, как и if (имя_изображения). Любой компетентный программист на C или C++ должен знать, что они делают.

1
ответ дан 27 November 2019 в 07:11
поделиться

Недостаток 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.

14
ответ дан 27 November 2019 в 07:11
поделиться

Предполагая, что у вас нет библиотеки или системного заголовка, определяющего NULL, как, например, (void*)0 или ( char*)0 все в порядке. Я всегда предпочитаю использовать 0, так как это по определению нулевой указатель. В c++0x у вас будет nullptr, так что этот вопрос больше не будет иметь большого значения.

1
ответ дан 27 November 2019 в 07:11
поделиться

From crtdbg.h (и многих других заголовков):

#ifndef NULL
#ifdef __cplusplus
#define NULL    0
#else
#define NULL    ((void *)0)
#endif
#endif

Поэтому NULL — это 0, по крайней мере, на платформе Windows. Так что нет, не то, что я знаю.

3
ответ дан 27 November 2019 в 07:11
поделиться
Другие вопросы по тегам:

Похожие вопросы: