You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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 输出文件名
      
  • 方案二:修改源码语法(彻底解决问题,后续升级编译器也不会再出现同类报错)
    把源码中所有throw(异常类型)的动态异常声明,统一替换为noexcept(false)即可,你报错的两行修改示例:
    原代码行1:
    void addData(const Data& data, double distance, const mtree* mtree) throw(SplitNodeReplacement) {
    
    修改为:
    void addData(const Data& data, double distance, const mtree* mtree) noexcept(false) {
    
    原代码行2:
    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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 03:36:04