我想用Visual Studio 2008 Express编译源代码但是我收到了这个错误:
Error C2065: 'nullptr' undeclared identifier.
我的代码:
if (Data == nullptr)
{
show("Data is null");
return 0;
}
我在google上看到我应该升级到Visual Studio 2010,但由于2008年的知识产权,我不想这样做。可以修理或更换吗?
答案 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")
一切都很顺利