Ошибка компиляции 'nullptr' необъявленный идентификатор

Я пытаюсь скомпилировать исходный код с помощью Visual Studio 2008 Express, но получаю эту ошибку:

Error C2065: 'nullptr' undeclared identifier.

Мой код:

if (Data == nullptr) {
    show("Data is null");
    return 0;
}

Я прочитал в Google, что мне следует перейти на Visual Studio 2010, но я не хочу этого делать из-за IntelliSense в Visual Studio 2008. Можно ли это исправить или заменить?


person VIclean    schedule 26.06.2014    source источник
comment
nullptr — это новая функция языка, и похоже, что ваш компилятор просто не поддерживает ее. Раньше это делалось для проверки на 0, но это не совсем безопасно для типов. Также вы можете прочитать это en.wikibooks.org/wiki/More_C%2B %2B_Idioms/nullptr   -  person shuttle87    schedule 26.06.2014
comment
Вы можете использовать nullptr только в Visual Studio 2010 и новее, это функция C++11.   -  person Cory Kramer    schedule 26.06.2014
comment
В чем разница между Intelisense в VS2008 и VS2010?   -  person Holt    schedule 26.06.2014
comment
Вы можете перейти на VS2010, как и почему это повлияет на использование Intellisense?   -  person Chris O    schedule 26.06.2014
comment
Вы знаете, что VS2008 не поддерживает nullptr. Вы знаете, что решение состоит в том, чтобы использовать более новый компилятор. И все же вы хотите как-то найти способ изменить компилятор, не меняя компилятор.   -  person David Heffernan    schedule 26.06.2014


Ответы (3)


Ошибка, которую вы получаете, связана с тем, что компилятор не распознает ключевое слово nullptr. Это связано с тем, что nullptr был представлен в более поздней версии Visual Studio, чем та, которую вы используете.

Есть два способа заставить это работать в более старой версии. Одна идея взята из книги Скотта Мейерса по С++, где он предлагает создать заголовок с классом, который эмулирует nullptr, например:

const // It is a const object...
class nullptr_t 
{
  public:
    template<class T>
    inline operator T*() const // convertible to any type of null non-member pointer...
    { return 0; }

    template<class C, class T>
    inline operator T C::*() const   // or any type of null member pointer...
    { return 0; }

  private:
    void operator&() const;  // Can't take address of nullptr

} nullptr = {};

Таким образом, вам просто нужно условно включить файл на основе версии msvc.

#if _MSC_VER < 1600 //MSVC version <8
     #include "nullptr_emulation.h"
#endif

Это имеет то преимущество, что используется одно и то же ключевое слово, и делает обновление до нового компилятора немного проще (и, пожалуйста, обновите его, если можете). Если вы теперь компилируете с помощью более нового компилятора, то ваш собственный код вообще не используется, и вы используете только язык С++, я чувствую, что это важно в будущем.

Если вы не хотите использовать этот подход, вы можете использовать что-то, что эмулирует старый подход в стиле C (#define NULL ((void *)0)), где вы создаете макрос для NULL следующим образом:

#define NULL 0

if(data == NULL){
}

Обратите внимание, что это не совсем то же самое, что и NULL, найденное в C, для более подробного обсуждения этого вопроса см. этот вопрос: Почему указатели NULL определены по-разному в C и C++?

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

person shuttle87    schedule 26.06.2014

nullptr является частью С++ 11, в С++ 03 вы просто используете 0:

if (!Data)
person Paul Evans    schedule 26.06.2014

Когда не рекомендуется редактировать исходный код, вы можете просто дать компилятору С++ соответствующее определение. Например, в CMakeLists.txt я добавил строку:

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Dnullptr=0")

И все работало хорошо

person PolyGlot    schedule 20.04.2021