2015-11-11 27 views
2

我正在使用VS2010的Win7上使用大量使用Qt 5.1.1框架的代碼庫,並且我們已將編譯警告級別設置爲4,以便可以捕獲儘可能多的或儘可能我們自己的問題。我們正在使用Qt的免費版本,所以我想也許這就是問題的所在,但是我們從包含的Qt頭文件中獲取了大量的警告。C++嵌套編譯指示警告推/流

我創建了兩個頭文件,一個具有以下內容:

// 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 sabled。

我有一個懷疑,並通過整個Qt源碼樹做了一個grep,發現有一些頭,他們自己做編譯警告推/彈出。其中一些在代碼中間執行此操作,我開始懷疑我的推送是否被他們的流行關閉。

我的問題是,是否可以像#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警告的泛濫而被忽視的內部警告。

回答

0

使用簡單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) 

,這將導致沒有編譯器警告(不包括鏈接器警告)。