我正在使用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警告的泛濫而被忽視的內部警告。