MCVE:
#pragma warning(push,0)
#include <QWidget>
#pragma warning(pop)
#include <QVariant>
int main(int argc, char *argv[])
{
}
使用Visual Studio 2015进行编译(如果重要的话选择“Qt Application”作为项目类型)和/ W4我得到Warning C4100 (unreferenced formal parameter)
和argc
的2x argv
这是我期望的和实际上对此感兴趣。但另外我在Warning C4251(class X needs to have dll-interface to be used by clients of struct Y)
内的某个地方获得5x qvariant.h
。
使用来自Qt的不同包含文件,我可以产生不同的警告,因此它不仅仅是C4251。我无法使用标准库包含它来重现它。如果我删除/注释#pragma warning
- 行或将项目/ W标志设置为较低级别,警告将消失。推动的水平似乎没有影响,所以例如使用/ W0和#pragma warning(push,4)
我没有收到任何警告。
我所期望的是,#pragma warning(push,0)
禁用<QWidget>
内的所有警告,#pragma warning(pop)
恢复初始状态。相反,Visual Studio似乎以某种方式检测到那些文件来自外部库(或者它是Qt代码中的内容?),但是只要有推/弹对,就会忽略推送的警告级别而不是最初的使用/ W标志设置警告级别。
我在使用CMake和cotire时遇到了这个问题,它自动生成一个头文件用作预编译头。所以在我的代码中,我不使用#pragma warning (push/pop)
编译没有Qt-Warnings的罚款。但是生成的文件将包含在推/弹对中,因此在我的项目中生成大约200个警告。我试图理解为什么会发生这种情况,以便找到一个解决方案,这个解决方案要求我既不要将所有手册包含在push / pop中,也不要对cotire进行私人修改。