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

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

NULL в C определяется реализацией.

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

Так что самое безопасное занятие:

 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; 

В 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_t остается nullptr_t ) и при использовании в некоторых контекстах, где nullptr не будет компилироваться (например, char c = NULL; ) (обратите внимание, а не char* c=NULL; )