Предложение уровня предупреждения QT

какой уровень предупреждения вы используете при компиляции проектов QT?

когда я скомпилирован с W4, я получаю много предупреждений, таких как:

C4127: conditional expression is constant

должен ли я компилироваться в W3 или найти другие способы обработки предупреждений в W4, такие как: добавление нового файла заголовка и использование pragma(упомянутые здесь стандарты кодирования 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.

использовать CONFIG += warn_on в своем .

посмотреть документация.

опции

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.

Если вы боретесь с Q_ASSERT в Visual studio, все эти предупреждения push / pop не будут работать, так как макросы "создаются" на месте, далеко позади заголовков. Поэтому я бы предложил переопределить Q_ASSERT:

#ifdef NDEBUG
#undef Q_ASSERT
#define Q_ASSERT(x) __noop
#endif

на основе 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

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