繁体   English   中英

C ++嵌套实用程序警告推送/弹出

[英]C++ Nesting pragma warning push/pop

我正在使用VS2010在Win7上开发代码,该代码库大量使用了Qt 5.1.1框架,并且我们将编译警告级别设置为4,以便我们可以捕获尽可能多的问题或我们自己的问题。 我们使用的是Qt的免费版本,所以我想问题可能出在这里,但是我们从包含的Qt标头中获得了大量警告。

我创建了两个头文件,其中一个包含以下内容:

// header file 1
#pragma warning(push)
#pragma warning(disable: 4091)
#pragma warning(disable: 4127)
#pragma warning(disable: 4231)
#pragma warning(disable: 4244)
#pragma warning(disable: 4251)
#pragma warning(disable: 4481)
#pragma warning(disable: 4512)
#pragma warning(disable: 4718)
#pragma warning(disable: 4800)

另一个具有以下内容:

// header file 2
#pragma warning(pop)

然后在代码中每个包含Qt头文件或一组Qt头文件的地方,我先添加头文件1,然后在最后一个Qt头之后添加头文件2结束它。解决方案中的一个小项目,但是对于其中一个大型项目,对于在头文件1中已禁用的代码,我仍然收到很多警告。

我怀疑了一下,并在整个Qt源代码树中进行了一次grep测试,发现其中有些标头本身确实在进行实用警告push / pop。 其中一些在代码中间执行此操作,我开始怀疑我的推送是否被其弹出窗口关闭。

我的问题是,是否可以像#ifdef一样嵌套#pragma warning(push)指令? 换句话说,正如我所能做的:

#ifdef DEF1
#ifdef DEF2
<dosomething>
#endif // for DEF2
#endif // for DEF1

是否可以执行以下操作:

// outer layer - my cpp file about to include a Qt header
#pragma warning(push)
#pragma warning(disable: 4091)

// inner layer - included Qt header file pushes and pops and then continues with more code
#pragma warning(push)
#pragma warning(disable: 2403)
<some code that actually uses this stuff>
#pragma warning(pop)

// back to outer layer - my file after the Qt header include
#pragma warning(pop)

还是第一个流行音乐同时弹出? 我本来以为它会嵌套,因为它应该被压入堆栈,但无法弄清楚为什么我仍然看到这些Qt警告。 Qt警告本身正在引用Qt文件,就像这样:

6>c:\qt\qt5.1.1\5.1.1\msvc2010\include\qtcore\qhash.h(72): warning C4127: conditional expression is constant

有什么想法吗? 我到处寻找嵌套的杂注警告推送/弹出消息,但是没有人在谈论它,下面关于警告的MSDN页面什么也没说:

https://msdn.microsoft.com/en-us/library/2c8f766e.aspx

非常重要的是,将其清除,因为真正的目标是开始处理由于Qt警告泛滥而被忽视的内部警告。

使用简单的MCVE:

void test()
{
#pragma warning( push )
#pragma warning( disable : 4305 ) // 'initializing' : truncation from 'double' to 'float'

#pragma warning( push )
#pragma warning( disable : 4244 ) // conversion from 'double' to 'float', possible loss of data
    {
        float f;
        double d = 21.0;
        f = d;  // warning C4244 : '=' : conversion from 'double' to 'float', possible loss of data
    }
#pragma warning( pop )

    {
        float ff = 1.02;  // warning C4305: 'initializing' : truncation from 'double' to 'float'
    }
#pragma warning( pop )

}

并使用Visual Studio 2013进行编译(我没有检查任何其他程序)导致警告为零。 这将表明(至少是幼稚的)嵌套的弹出/推送可以按预期工作。 根据外部库的不同,如果使用禁用/默认对(而不是推/弹出对)完成操作,它们实际上可以启用禁用警告警告:

void test()
{
#pragma warning( push )
#pragma warning( disable : 4305 ) // 'initializing' : truncation from 'double' to 'float'

#pragma warning( disable : 4244 ) // conversion from 'double' to 'float', possible loss of data
#pragma warning( disable : 4305 ) // 'initializing' : truncation from 'double' to 'float'
    {
        float f;
        double d = 21.0;
        f = d;  // warning C4244 : '=' : conversion from 'double' to 'float', possible loss of data
        f = 1.02;  // warning C4305: 'initializing' : truncation from 'double' to 'float'
    }
#pragma warning( default : 4244 ) // conversion from 'double' to 'float', possible loss of data
#pragma warning( default : 4305 ) // 'initializing' : truncation from 'double' to 'float'

    {
        // In this case, the following line results in a warning,
        // despite the #pragma warning( disable : 4305 ) line above
        float ff = 1.02;  // warning C4305: 'initializing' : truncation from 'double' to 'float'
    }
#pragma warning( pop )

}

在这种情况下,我们在float ff = 1.02;处收到警告float ff = 1.02; 尽管有#pragma warning( disable : 4305 )行位于顶部, 您可以关闭所有编译器警告(以使默认设置为关闭),是替换您的

#pragma warning( push )
#pragma warning( disable : 123456789 )
// included external code you don't want to hear about
#pragma warning( pop )

#pragma warning( push, 0 )
// included external code you don't want to hear about
#pragma warning( pop )

这将导致没有编译器警告(不包括链接器警告)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM