Тестирование на NULL или nullptr - PullRequest
0 голосов
/ 19 апреля 2020

См. Этот код:

if (m_hStatusBarPageBreakIcon != NULL)
    VERIFY(DestroyIcon(m_hStatusBarPageBreakIcon));

Иногда, когда я решил использовать nullptr, компилятор жалуется. Но как правило, нормально ли использовать nullptr? Эта переменная имеет тип HICON.

Ответы [ 2 ]

3 голосов
/ 19 апреля 2020

При условии, что компилятор поддерживает nullptr, единственный случай, когда проверка дескриптора для NULL работает, но для nullptr не удается компилятору, это случай, когда дескриптор не определен как указатель.

Так как заголовки Windows определяют NULL как 0, проверка для NULL может работать, например, для целочисленных дескрипторов. Конечно, проверка целого числа для nullptr является ошибкой.

В таких случаях, если какой-то дескриптор является целочисленным или задокументирован некоторый API для принятия NULL, я бы все равно заменил NULL, а не на nullptr, но с буквальным 0.

0 голосов
/ 19 апреля 2020

Я буду смотреть на это с другой точки зрения. В основном я хочу иметь типобезопасный код. NULL даже лучше, чем nullptr, потому что 0 имеет тип int, а nullptr - что угодно.

И инструменты анализа кода stati c будут выдавать информацию, если вы напишите uint i=3U, тогда еще немного кода, а затем if (i == 0). То же самое с NULL и nullptr.

Итак, что я использую:

template <typename T>
const T null(void) 
{
    return static_cast<T>(0);
}

Пример кода

typedef unsigned char uchar;
. . . 
uchar someVariable = null<uchar>();
SomeComplexClass *someComplexClass = null<SomeComplexClass *>();
. . . 
if (null<SomeComplexClass *>() == someComplexClass)
{
    . . . 
}

Там сидит обычный программист и говорит. Что это за ерунда?

Но подумайте, мы разработали некоторый код ASIL D. А затем вы рефакторинг вашего кода. И вы случайно измените «SomeComplexClass» на «someOtherComplexClass».

if (null<SomeComplexClass *>() == someOtherComplexClass) 

С этим типом безопасного 0 инструменты анализа кода stati c будут выдавать информацию.

Подумайте об этом, когда вы в следующий раз будете водить свой автомобиль с программным обеспечением для руля, тормоза или акселератора ASIL D.

КСТАТИ: также следует избегать auto везде, где это необходимо возможно в таком коде.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...