当前位置:C++技术网 > 资讯 > nullptr was not declared in this scope

nullptr was not declared in this scope

更新时间:2017-02-07 10:22:56浏览次数:1+次

    在使用g++编译C++代码时,提示了错误error: 'nullptr' was not declared in this scope。这份代码此前在VS2010编译过,没有问题。现在在Linux下的gcc4.4.7下编译,出现了错误。
    这个错误提示有点迷惑性,意思是nullptr在当前作用域没有被声明,就好像是变量没有声明一样的。实际上,nullptr是C++11引入的关键字,这个编译器没有支持C++11。出现这个错误说明你的编译器没有支持C++11,至少没有完整支持C++11。
    问题清楚了,就好解决了。解决的方法有两个方向:
1.设置编译器或升级编译器到gcc4.8.1,完全支持C++11
    如果你的gcc编译器部分支持C++11,你可以添加编译选项开启支持C++11。4.4.7可以这样开启:
g++ -std=c++0x cjjjs.cpp

    加上编译选项-std=c++0x就可以了。如果不设置这个选项,auto特性就不支持。但是即使设置了这个选项,nullptr还是不支持。如果你的代码有大量的C++11特性,那就建议升级gcc编译器到4.8.1版本。gcc4.8.1开启C++11支持是这样的:

g++ -std=c++0x cjjjs.cpp

    安装gcc4.8.1可以参考其他文章。

2.改代码,不要使用C++11特性
    如果你的代码只有几处C++特性的代码,那就没有必要去折腾编译器了。我们这里就是nullptr,也就几个地方使用了。升级编译器还是有点费事,况且新手的话,很容易搞出问题,到时候连正常的编译都成了问题。
    我们只要将C++11特性的代码等价替换为旧标准C++代码即可。nullptr是C++11引入的,表示空指针。那么我们以前的空指针要么使用宏NULL表示,要么直接使用0表示。所以,我们只要将nullptr替换为0或NULL就搞定了。这样不是很轻松!
    我现在这个问题,就是这样解决的。不想去折腾编译器,因为代码的C++11特性不多,没有必要为了几个地方换上整个编译器。既然这里的编译器没有完全支持C++11,万一代码换一个地方编译,如果又不支持,难道又去升级编译器?所以,将代码变成旧标准的,大家都支持的,更通用些,更安全。

    个人体验或者仅仅个人使用的代码,可以使用C++11去处理,如果是公司代码或者多人协作的或者公开的代码,尽量不要使用太新的标准,以免给其他人造成麻烦。