[英]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.