编译错误'nullptr'未声明的标识符
Compile error 'nullptr' undeclared identifier
我正试图用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")
一切都很顺利
相关文章:
- #ifdef和未声明的标识符
- 未声明的标识符编译暗黑破坏神 2 程序"muleview"
- 在顶点着色器中使用 OpenGl 的未声明标识符,我在顶点着色器中绘制三角形时遇到问题
- Google protobuf 时间戳未声明标识符,在 Windows 上具有C++
- 使用未声明的标识符"sqrt"?
- 对类 (C++) 中的私有变量使用未声明的标识符
- 我的代码中有错误,未声明的标识符
- 未定义的标识符/未声明
- 错误:在 C++ 'std'使用未声明的标识符
- 在编译器之前检测未声明的标识符
- 使用未声明的标识符'temp'
- 使用未声明的标识符"yylex"和"yyin"?
- 使用"class"关键字,后跟未声明的标识符
- 未声明的标识符错误,但变量定义正确 (?)
- C2065 'cout':未声明的标识符
- C++模板模板参数中未声明的标识符
- 错误:在 C++ 目标 c 混合'self'使用未声明的标识符
- C++循环依赖关系,未声明的标识符
- 我的函数调用 (C++) 中的未声明标识符
- 未找到标识符和未声明的标识符