编译错误' nullptr'未声明的标识符

时间:2014-06-26 14:39:50

标签: c++ visual-studio-2008 nullptr

我想用Visual Studio 2008 Express编译源代码但是我收到了这个错误:

Error C2065: 'nullptr' undeclared identifier.

我的代码:

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

我在google上看到我应该升级到Visual Studio 2010,但由于2008年的知识产权,我不想这样做。可以修理或更换吗?

3 个答案:

答案 0 :(得分:7)

您遇到的错误是因为编译器无法识别nullptr关键字。这是因为nullptr是在Visual Studio的更高版本中引入的,而不是您正在使用的版本。

有两种方法可以让它在旧版本中运行。一个想法来自Scott Meyers c ++书籍,他建议用一个模拟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 ++语言,我觉得这很重要。

如果你不想采用这种方法,你可以选择模仿旧C风格方法(#define NULL ((void *)0))的东西,你可以像这样为NULL制作一个宏:

#define NULL 0

if(data == NULL){
}

请注意,这与C中的NULL不完全相同,有关详细讨论,请参阅此问题:Why are NULL pointers defined differently in C and C++?

这样做的缺点是你必须改变源代码,它不像nullptr那样是类型安全的。所以谨慎使用它,如果你不小心,它会引入一些微妙的错误,而这些微妙的错误首先促使nullptr的发展。

答案 1 :(得分:5)

nullptr是C ++ 11的一部分,在C ++ 03中你只需使用0

if (!Data)

答案 2 :(得分:0)

当不建议编辑源代码时,您可以给您的 C++ 编译器适当的定义。例如,在 CMakeLists.txt 我添加了一行:

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

一切都很顺利