为什么#pragma warning(push,0)在MSVC 2015中启用其他警告?

时间:2017-12-03 12:12:51

标签: c++ visual-studio visual-studio-2015 compiler-warnings

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进行私人修改。

0 个答案:

没有答案