我正在尝试使用-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的配置)。我想快速解决一下我的建议。
修改
我找到了一个解决方法,请参阅下面的答案。
答案 0 :(得分:11)
你不能在程序中使用-fno-exceptions
标志,使用异常(try / catch / throw)。
在详细说明-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:
- 删除STL库中的所有异常处理;抛出被abort()调用替换
- 删除堆栈展开数据和代码。这节省了一些代码空间,并且可能使编译器的寄存器分配更容易(但我怀疑它会对性能产生很大的影响)。但值得注意的是,如果抛出异常,并且库试图通过
醇>-fno-exceptions
代码展开,它将在该点中止,因为没有展开数据。这将有效地将所有异常转换为
abort()
s,如您所愿。但请注意,您不会被抛出 - 代码中的任何实际throw
或catch
都将导致编译时错误。