簡體   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