Почему мой код компилируется с -fno-exceptions в Qt Creator, когда я пытаюсь использовать исключения? - PullRequest
5 голосов
/ 10 января 2012

В файле проекта .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 ]

11 голосов
/ 10 января 2012

Вы не отключаете исключения, устанавливая QMAKE_CXXFLAGS, потому что этот параметр обрабатывается CONFIG. Вы должны использовать

CONFIG-=exceptions

чтобы отключить их.

См. Аргументы g ++, когда у вас не изменились настройки QMAKE_CXXFLAGS и CONFIG:

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

Теперь давайте установим QMAKE_CXXFLAGS: получим

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

Упс, мы получаем, что -fno-exceptions переопределяется на CONFIG s -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

Oh! ошибка компиляции!

6 голосов
/ 10 января 2012

Я немного смущен вопросом.

Если у вас есть (или ссылка на) код, который генерирует исключения, вы не можете просто волшебным образом заставить их исчезнуть, создав свой код с помощью -fno-exceptions. Флаг влияет на генерацию кода, необходимого для поддержки try и catch, больше, чем код, который фактически выдает исключения.

Подробнее см. Документация GCC . В документации сказано:

В итоге действительный код C ++ с обработкой исключений превращается в диалект без обработки исключений.

Таким образом, похоже, что компилятор более или менее заставляет код обработки исключений (и выбрасывает) «уходить», а не обнаруживать его использование и отмечать ошибку. Последнее, кажется, то, что вы ожидаете, но тогда это ожидание просто неверно.

2 голосов
/ 10 января 2012

попробуйте использовать оба из следующих

QMAKE_CFLAGS_RELEASE -= -fno-exceptions

QMAKE_CXXFLAGS_RELEASE -= -fno-exceptions
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...