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

Compile error 'nullptr' undeclared identifier

本文关键字:标识符 未声明 nullptr 编译 错误      更新时间:2023-10-16

我正试图用Visual Studio 2008 Express编译源代码,但我得到这个错误:

Error C2065: 'nullptr' undeclared identifier.
我代码:

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

我在谷歌上读到我应该升级到Visual Studio 2010,但我不想这样做,因为Visual Studio 2008中的智能感知。这个可以修理或更换吗?

您得到的错误是因为编译器不识别nullptr关键字。这是因为nullptr是在比您正在使用的visualstudio版本更晚的版本中引入的。

在旧版本中有两种方法可以让它工作。一个想法来自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不完全相同,关于这一点的更多讨论请参见这个问题:为什么在C和c++中定义NULL指针不同?

这样做的缺点是您必须更改源代码,而且它不像nullptr那样是类型安全的。所以要谨慎使用,如果你不小心,它可能会引入一些微妙的bug,而正是这些微妙的bug首先激发了nullptr的开发。

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

if (!Data)

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

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

一切都很顺利