gpt4 book ai didi

C++ 嵌套 pragma 警告推送/弹出

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:48:28 25 4
gpt4 key购买 nike

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

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

// 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,发现有一些 header 本身会执行 pragma 警告 push/pops。其中一些在代码中间执行此操作,我开始怀疑我的推送是否被他们的 pop 关闭了。

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

#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)

或者第一个 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

对此有什么想法吗?我四处寻找嵌套的 pragma warning push/pop,但没有人谈论它,下面的 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; 行收到警告,尽管顶部有 #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 )

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

关于C++ 嵌套 pragma 警告推送/弹出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33658105/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com