【问题标题】:Compile error 'nullptr' undeclared identifier编译错误'nullptr'未声明的标识符
【发布时间】:2014-08-17 11:28:51
【问题描述】:

我正在尝试使用 Visual Studio 2008 Express 编译源代码,但出现此错误:

Error C2065: 'nullptr' undeclared identifier.

我的代码:

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

我在 Google 上看到我应该升级到 Visual Studio 2010,但由于 Visual Studio 2008 中的 IntelliSense,我不想这样做。可以修复或更换吗?

【问题讨论】:

  • nullptr 是一种较新的语言功能,看起来您的编译器不支持它。以前这样做是为了检查 0 但这不是类型安全的。您也可能想阅读此en.wikibooks.org/wiki/More_C%2B%2B_Idioms/nullptr
  • 您只能在 Visual Studio 2010 及更高版本中使用 nullptr,它是 C++11 功能。
  • VS2008和VS2010中的智能感知有什么区别?
  • 您可以升级到 VS2010,这会如何/为什么会影响您对 Intellisense 的使用?
  • 你知道VS2008不支持nullptr。您知道解决方案是使用更新的编译器。然而你想以某种方式找到一种方法来改变编译器而不改变编译器。

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


【解决方案1】:

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

有 2 种方法可以让您在旧版本中使用它。一个想法来自 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 的开发。

【讨论】:

    【解决方案2】:

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

    if (!Data)
    

    【讨论】:

      【解决方案3】:

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

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

      一切顺利

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-03-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-03-12
        • 1970-01-01
        • 2013-01-22
        • 2011-10-25
        相关资源
        最近更新 更多