C ++:错误:禁用异常处理,使用-fexceptions启用

时间:2015-08-19 11:44:56

标签: c++ c++11

我正在尝试使用-fno-exceptions标志编译简单代码。它给出错误。

请让我知道如何压制这个。我正在使用gcc版本4.6.3

代码

#include <iostream>
using namespace std;
int main () {
  try
  {
    throw 20;
  }
  catch (int e)
  {
    cout << "An exception occurred. Exception Nr. " << e << '\n';
  }
  return 0;
}

日志

> g++ throw.cc -o out -fno-exceptions
throw.cc: In function ‘int main()’:
throw.cc:10:11: error: exception handling disabled, use -fexceptions to enable
throw.cc:14:56: error: ‘e’ was not declared in this scope

修改

我有一个客户端代码,有很多这样的抛出。我必须将它集成到我的项目中,并且我无法控制要构建的编译标志(这将来自启用了-fno-exceptions的配置)。我想快速解决一下我的建议。

修改

我找到了一个解决方法,请参阅下面的答案。

3 个答案:

答案 0 :(得分:11)

你不能在程序中使用-fno-exceptions标志,使用异常(try / catch / throw)。

来自gcc manual

  

在详细说明-fno-exceptions的库支持之前,首先要做一个   传递关于使用此标志时丢失的东西的注释:它将会中断   尝试传递使用-fno-exceptions编译的代码的异常   该代码是否有任何try或catch结构。 如果可能的话   有一些抛出的代码,你不应该使用-fno-exceptions。如果你   有一些使用try或catch的代码,你不应该使用   -fno-异常。

答案 1 :(得分:3)

我找到了解决方法。除了&#34; e&#34;在catch块中,代码可以像

一样重写
PType3

可以用

编译
#include <iostream>
using namespace std;
int main () {
  __try
  {
    __throw_exception_again 20;
  }
  __catch (int e)
  {
    cout << "An exception occurred." << '\n';
  }
  return 0;
}

答案 2 :(得分:1)

如果在自己的代码中抛出异常,则无法使用此标志编译程序。 -fno-exceptions标记为following

  
      
  1. 删除STL库中的所有异常处理;抛出被abort()调用替换
  2.   
  3. 删除堆栈展开数据和代码。这节省了一些代码空间,并且可能使编译器的寄存器分配更容易(但我怀疑它会对性能产生很大的影响)。但值得注意的是,如果抛出异常,并且库试图通过-fno-exceptions代码展开,它将在该点中止,因为没有展开数据。
  4.         

    这将有效地将所有异常转换为abort() s,如您所愿。但请注意,您不会被抛出 - 代码中的任何实际throwcatch都将导致编译时错误。