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

sma*_*llB 5 c++ qt

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

QMAKE_CXXFLAGS += -fno-exceptions  
Run Code Online (Sandbox Code Playgroud)

然而,我能够在我的应用程序中抛出异常.有什么想法吗?

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

#include <QApplication>
#include <QtDebug>

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

    }
    return app.exec();
}
Run Code Online (Sandbox Code Playgroud)

Lol*_*4t0 11

您不能通过设置关闭异常,QMAKE_CXXFLAGS因为此选项由处理CONFIG.你应该用

CONFIG-=exceptions
Run Code Online (Sandbox Code Playgroud)

把它们关掉

如果既QMAKE_CXXFLAGS没有CONFIG更改也没有更改设置,请参阅g ++ args :

g++ -c -O2 -frtti -fexceptions -mthreads -Wall <...> main.cpp
Run Code Online (Sandbox Code Playgroud)

现在,让我们设置QMAKE_CXXFLAGS:get

g++ -c -fno-exceptions -O2 -frtti -fexceptions -mthreads -Wall <...> main.cpp
Run Code Online (Sandbox Code Playgroud)

哎呀,我们得到我们-fno-exceptions被重写CONFIG-fexceptions.现在,让我们设置CONFIG:

g++ -c -O2 -frtti -Wall -fno-exceptions <...> main.cpp
mingw32-make.exe[1]: Leaving directory `G:/proj/ingeritance'
main.cpp: In function 'int qMain(int, char**)':
main.cpp:22:15: error: exception handling disabled, use -fexceptions to enable
mingw32-make.exe[1]: *** [release/main.o] Error 1
mingw32-make.exe: *** [release] Error 2
Run Code Online (Sandbox Code Playgroud)

哦! 编译错误!


unw*_*ind 6

我对这个问题有点困惑.

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

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

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

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