Почему qDebug работает в сборках Release?

Исходя из МФЦ я лечил qDebug() так же, как TRACE()при условии, что препроцессор удаляет его из сборок Release (в MFC это делается с помощью #define TRACE 1 ? (void*) 0 : AfxTrace).

К моему удивлению, однако, qDebug() выполняется также в сборках Release. Как мне это изменить? А также, почему это так, каково было обоснование разработчиков Qt за этим решением?

18

Решение

qDebug также управляется препроцессором, но у него есть свой специальный макрос, QT_NO_DEBUG_OUTPUT, Если вы добавите это в свои определения сборки выпуска, оно будет удалено.

23

Другие решения

QDebug — это «поток вывода для отладочной информации». Это имеет поведение по умолчанию, которое печатает в stdout / stderr в зависимости от типа сообщения. Вы можете легко настроить поведение qDebug (), установив собственный обработчик сообщений. Например, вы можете проверить во время выполнения (не во время компиляции), хотите ли вы печатать отладки. Посмотрите на этот пример кода:

#include <QDebug>

void noMessageOutput(QtMsgType type, const char *msg)
{
Q_UNUSED(type);
Q_UNUSED(msg);
}

int main(int argc, char * argv[])
{
QApplication app(argc, argv);

if ( ! app.arguments().contains(QLatin1String("--with-debug") ) {
qInstallMsgHandler(noMessageOutput);
}
}

Он будет скрывать весь вывод qDebug, если во время выполнения не указан параметр. Вы получаете больше контроля, чем просто «показать отладку / не показывать отладку»

Также вы можете полностью отключить QDebug с помощью QT_NO_DEBUG_OUTPUT определите, беспокоитесь ли вы о производительности, потерянной с присутствующим в коде qDebug

16

Используйте это для подавления сообщений в режиме выпуска, но разрешите их в режиме отладки:

CONFIG(release, debug|release):DEFINES += QT_NO_DEBUG_OUTPUT

Если вы используете только DEFINES += QT_NO_DEBUG_OUTPUT без CONFIG(...) Часть вы отключите их в обоих режимах, что обычно нежелательно.

2
По вопросам рекламы [email protected]