QT предупреждение уровня предложения
Какой уровень предупреждения вы используете при компиляции проектов QT?
Когда я скомпилировал с W4, я получил много предупреждений, таких как:
C4127: conditional expression is constant
Должен ли я скомпилировать на W3 или найти другие способы обработки предупреждений на W4, такие как: добавление нового заголовочного файла и использование прагм (упомянутых здесь C++ Стандарты кодирования: 101 правила, руководящие указания и рекомендации).
Каковы ваши практики?
Благодарю.
5 ответов
Я столкнулся с той же самой проблемой, с которой вы столкнулись пару лет назад, - установкой компилятором предупреждений 4-го уровня, чтобы поймать как можно больше потенциальных проблем. В то время у меня был контракт на поддержку с Qt, и я спросил их, почему их код генерирует так много предупреждений. Их ответ состоял в том, что они никогда не гарантировали, что их код будет компилироваться без каких-либо предупреждений. Только то, что их код будет работать правильно.
После нескольких попыток я начал окружать файлы заголовков Qt прагмами, чтобы отключить предупреждения, как показано ниже -
#pragma warning(push,3) // drop compiler to level 3 and save current level
#include <QString>
#include <QVariant>
#include <QStack>
#include <QLabel>
#include <QtGui/QTableWidget>
#pragma warning(pop) // restore compiler warning level
Делая это таким образом, вы только компилируете файлы заголовков Qt с более низким уровнем предупреждения. Или любой уровень, необходимый для избавления от предупреждений. У вас могут быть отдельные предупреждения, которые все еще отображаются, поэтому вы можете повысить уровень предупреждения или отключить отдельные предупреждения с помощью
#pragma warning(disable: 4700)
Некоторые файлы библиотеки Boost также имеют эту проблему.
Лично я просто использую файлы Makefile, которые qmake генерирует по умолчанию... при условии, что я могу доверять ребятам из Nokia, чтобы они создавали файлы Makefile, которые делают то, что нужно для текущей среды сборки.
Я вижу, что qmake примет некоторые необязательные аргументы относительно предупреждений:
The level of warning information can be fine-tuned to help you find problems in your project file:
-Wall
qmake will report all known warnings.
-Wnone
No warning information will be generated by qmake.
-Wparser
qmake will only generate parser warnings. This will alert you to common pitfalls and potential problems in the parsing of your project files.
-Wlogic
qmake will warn of common pitfalls and potential problems in your project file. For example, qmake will report whether a file is placed into a list of files multiple times, or if a file cannot be found.
Если вы боретесь с Q_ASSERT в Visual studio, все эти предупреждающие push/pop-вещи не сработают, поскольку макросы "создаются" на месте, далеко позади ваших заголовков. Поэтому я бы предложил переопределить Q_ASSERT:
#ifdef NDEBUG
#undef Q_ASSERT
#define Q_ASSERT(x) __noop
#endif
Использование CONFIG += warn_on
в вашем .pro
файл.
Смотрите документацию.
вариант
warn_on The compiler should output as many warnings as possible. This is ignored if warn_off is specified. warn_off The compiler should output as few warnings as possible.
Основываясь на ответе user2846246, я обнаружил, что добавление следующего в начале компиляции любой библиотеки, использующей Qt, сделало свое дело (в моем случае эта библиотека использует предварительно скомпилированный заголовочный файл в Visual Studio, поэтому я просто добавил код в этот заголовочный файл):
#ifndef _DEBUG
#undef Q_ASSERT
#define Q_ASSERT(x) __noop
#undef Q_ASSERT_X
#define Q_ASSERT_X(cond, where, what) __noop
#endif
Это здорово, так как мне не нравится снижать уровень предупреждения всей библиотеки.