QT警告级别建议

时间:2010-04-30 05:39:28

标签: c++ qt coding-style warnings warning-level

编译QT项目时使用的警告级别是什么?

当我使用W4进行编译时,我收到了很多警告,例如:

C4127: conditional expression is constant

我应该在W3编译,还是找到其他方法来处理W4中的警告,例如:添加新的头文件并使用编译指示(这里提到的C ++编码标准:101规则,指南和最佳实践)。

你的做法是什么?

感谢。

5 个答案:

答案 0 :(得分:11)

我遇到了几年前你遇到的完全相同的问题,那就是将编译器设置为4级警告以尽可能多地捕获一些问题。当时,我与Qt签订了一份支持合同,并问他们为什么他们的代码会产生如此多的警告。他们的反应是,他们从不嘲笑他们的代码会在没有任何警告的情况下编译。只有他们的代码才能正确运行。

经过多次尝试后,我开始使用pragma包围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库文件也存在此问题。

答案 1 :(得分:4)

就个人而言,我只是使用qmake默认生成的Makefile ...假设我可以信任诺基亚的人,让它生成Makefiles,为当前的构建环境做正确的事。

我确实看到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.

答案 2 :(得分:1)

CONFIG += warn_on文件中使用.pro

请参阅the documentation

  

方法

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.

答案 3 :(得分:1)

如果您正在使用Visual Studio中的Q_ASSERT进行战斗,那么所有警告推送/弹出内容都无法正常工作,因为宏已经实例化了#34;到位,远远落后于你的标题。 所以我建议重新定义Q_ASSERT:

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

答案 4 :(得分:0)

基于 user2846246 的回答,我发现在编译使用Qt的任何库的早期添加以下内容都有诀窍(在我的情况下,库使用预编译的头文件)在Visual Studio中,所以我只是将代码添加到该头文件中):

int arr1[] = { 1,4,5 };
int arr2[] = { 3,5,6 };
int arr3[] = { 6,6,2 };
int arr4[] = { 6,5,3 };

int *p[4] = { arr1, arr2, arr3, arr4 };                                                               

这很棒,因为我不喜欢放弃整个图书馆的警告级别。