当我尝试使用异常时,为什么我的代码在Qt Creator中使用-fno-exceptions进行编译?

时间:2012-01-10 12:05:33

标签: c++ qt

在项目.pro文件中我指定了:

QMAKE_CXXFLAGS += -fno-exceptions  

然而,我可以在我的应用程序中抛出异常。有什么想法吗?

示例:这应该不起作用,但它可以正常工作

#include <QApplication>
#include <QtDebug>

int main(int c, char**v)
{
    QApplication app(c,v);
    try
    {
        throw 1;
    }
    catch(int i)
    {

    }
    return app.exec();
}

3 个答案:

答案 0 :(得分:11)

您不会通过设置QMAKE_CXXFLAGS来关闭例外,因为此选项由CONFIG处理。你应该使用

CONFIG-=exceptions

关闭它们。

如果您未更改QMAKE_CXXFLAGSCONFIG设置,请参阅g ++参数:

g++ -c -O2 -frtti -fexceptions -mthreads -Wall <...> main.cpp

现在,让我们设置QMAKE_CXXFLAGS:获取

g++ -c -fno-exceptions -O2 -frtti -fexceptions -mthreads -Wall <...> main.cpp

哎呀,我们-fno-exceptionsCONFIG的{​​{1}}覆盖了。 现在,让我们设置-fexceptions

CONFIG

哦!编译错误!

答案 1 :(得分:6)

我对这个问题感到有点困惑。

如果您拥有(或链接到)引发异常的代码,那么您不能通过使用-fno-exceptions构建代码来神奇地让它们消失。该标志会影响支持trycatch所需的代码生成,而不是实际抛出异常的代码。

有关详细信息,请参阅GCC documentation。文档说:

  

总而言之,带有异常处理的有效C ++代码将转换为方言而无需异常处理。

因此,似乎编译器或多或少会导致异常处理(和抛出)代码“消失”,而不是检测其使用并标记错误。后者似乎是你所期待的,但那种期望是完全错误的。

答案 2 :(得分:2)

尝试使用以下两个

QMAKE_CFLAGS_RELEASE -= -fno-exceptions

QMAKE_CXXFLAGS_RELEASE -= -fno-exceptions