GCC11.2.0编译C++项目报不支持动态异常规范错误如何解决?
动态异常规范编译报错解决方法
报错核心原因
动态异常规范(throw(异常类型)语法)在C17标准中被正式移除,GCC 11.2.0版本对C标准合规性检查更严格,即使指定使用C11标准编译,也会将该语法判定为错误。修改cppStandard为c11仍然失效的原因是GCC 8及以上版本,即使指定旧标准,也会对已被后续标准移除的语法做严格校验,默认将该类问题判定为编译错误。
可选解决方案
- 方案一:修改编译参数(无需改动源码,适合C++基础薄弱的用户)
直接在编译选项中添加-fpermissive参数,让GCC对不符合当前标准的语法降级为警告而非阻断编译的错误:- 如果你使用CMake编译,在项目根目录的
CMakeLists.txt中添加如下配置即可:set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fpermissive") - 如果你直接使用g++命令行编译,在原有编译命令末尾添加参数即可,示例:
g++ 你的源文件列表 -std=c++11 -fpermissive -o 输出文件名
- 如果你使用CMake编译,在项目根目录的
- 方案二:修改源码语法(彻底解决问题,后续升级编译器也不会再出现同类报错)
把源码中所有throw(异常类型)的动态异常声明,统一替换为noexcept(false)即可,你报错的两行修改示例:
原代码行1:
修改为:void addData(const Data& data, double distance, const mtree* mtree) throw(SplitNodeReplacement) {
原代码行2:void addData(const Data& data, double distance, const mtree* mtree) noexcept(false) {
修改为:virtual void doRemoveData(const Data& data, double distance, const mtree* mtree) throw (DataNotFound) = 0;virtual void doRemoveData(const Data& data, double distance, const mtree* mtree) noexcept(false) = 0;
内容的提问来源于stack exchange,提问作者Nimish
相关产品推荐
相关产品推荐

