Подтвердить что ты не робот

Является ли C NULL равным С++ 11 nullptr

Мне нравится использовать nullptr вместо NULL. Теперь я вызываю функцию C (от libjansson в этом случае).

NULL в C - реализация определена.

В nullptr я обнаружил, что "константа нулевого указателя является интегральным константным выражением (5.19) rvalue целочисленного типа, который оценивается в 0".

Итак, самая безопасная вещь:

auto string_obj=json_object_get(m_handle,name);
if(string_obj!=NULL)
    {
    auto string=json_string_value(string_obj);
    if(string!=NULL)
        {return string;}
    }
return nullptr;

Мне это действительно нужно или я могу сделать это проще:

auto string_obj=json_object_get(m_handle,name);
if(string_obj!=nullptr)
    {
    return json_string_value(string_obj); //Assume there is no difference between C NULL and C++11 nullptr
    }
return nullptr;
4b9b3361

Ответ 1

В C++ 11 и далее указатель, который является ==NULL, также будет ==nullptr и наоборот.

Использование NULL, отличное от сравнения с указателем (например, использование его для представления нулевого байта в конце строки) не будет работать с nullptr.

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

Поскольку ваша реализация C++ совместима с реализацией C, с которой вы взаимодействуете (очень редко, если это не так), все должно работать.


Чтобы было очень ясно, если ptr является любым указателем, то следующие выражения эквивалентны в C++:

ptr == nullptr
ptr == NULL
ptr == 0
!ptr

Как и следующее:

ptr = nullptr
ptr = NULL
ptr = 0

и если X - это какой-то тип, то таковы и следующие утверждения:

X* ptr = nullptr;
X* ptr = NULL;
X* ptr = 0;

nullptr отличается, когда вы передаете его в шаблонную функцию, которая выводит тип (NULL или 0 становятся int, если не переданы аргументу, ожидающему указатель, в то время как nullptr остается nullptr_t) и при использовании в некоторых контекстах, где nullptr не будет компилироваться (например, char c = NULL;) (обратите внимание, не char* c=NULL;)

Наконец, буквально:

NULL == nullptr

верно.

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