2009-06-10 46 views
2

我有一個項目,我剛剛發現警告C4244(可能丟失數據)正在被抑制。我強烈懷疑一些不起眼的MS頭部正在壓制這個警告,並且對包含所述頭部的所有翻譯單元進行抑制,但是我還沒有確定他們的無數頭部中哪些頭部可能有問題。因此,像任何其他編程問題一樣,我想先做二進制搜索,打印出當前的警告級別,如果可能的話,在我的主要預編譯頭文件中打印出任何壓制的警告。VC++編譯器:如何確定當前的警告級別或覆蓋?

有沒有人知道我可能會使用什麼編譯器指令,或者我可能採取哪種方法來提供這些信息?

我不能告訴你,如果發現在我的頭文件中仔細構造的類型聲明無法在調用者違反合同並嘗試向我發送一個整數而不是有符號字節時給予編譯器警告(這是導致了目前我試圖解決的錯誤)。

想法?

注:通過我的整個解決方案的#pragma

搜索拿出僅有的#pragma均衡聲明警告(禁用:XXXX),隨後用#pragma警告(默認:XXXX)。並沒有那些參考4244.

搜索4244在整個解決方案返回沒有匹配(我從來沒有重寫該警告,也沒有任何我包括的庫,子項目等)。

在4244上遍及整個MS的搜索包括路徑返回幾個引用,那麼出現要根據在調用它們之前設置的#define符號進行平衡或幾乎如此。因此,我懷疑MS是錯誤的(加上MS在他們的頭文件中做了瑣碎的工作)。

回答

0

經過進一步調查:

/P花費的時間太長(我從來沒有親眼目睹了越來越超出了近一個小時的過程中的幾個文件,所以我取消了構建)

我從來沒有能夠找到一個明確的方式來打印出當前的警告級別是什麼,或者是編譯過程中某個特定點有效的覆蓋。所以我提出的問題並沒有得到真正的答案,除非/ P參數實際上對你有用(正如我提到的,這對我的目的來說是不切實際的)。

我能夠做的就是構建在各種標頭的一些內嵌調用,應該產生必要的警告,如果警告級別包括該警告的活躍,以驗證該警告是活躍與否:

內聯int測試(char值){返回++值; }

包括 「東西」

直列INT TEST1(int值){返回試驗(值); } //應該產生C4244 - 可能丟失數據如果前面的#include沒惹了警戒水位或超控警告4244

等等......

最後,我發現特別是4244有一些與之相關的奇怪規則,除了/ W4(警告等級4)之外,它是有效「禁用」的 - 最高的警告等級。由於該警告級別非常非常敏感,並且抱怨很多事情超出了我們對它們做任何事情的範圍,所以我不想啓用/ W4。

我所做的卻是擺在我們的stdafx.h PCH如下:

編譯警告(錯誤:4244)//這完全能夠對可能造成的數據丟失在所有情況下,隱式類型轉換,無論警告的主動警告級別

工作正常。

因此,MS沒有在他們任何影響我們的文件中留下不平衡的警告覆蓋。只是4244非常寬容,除非處於最高警戒水平,無論如何,它對我們來說都變得真正有用​​。

感謝您的幫助!

0

你可以只搜索「C4244」的所有頭文件嗎?還是隻能訪問預編譯的頭文件?

0

您可以先使用/P compiler command line option開始。它將預處理器的輸出輸出到文件中。通過這種方式,你可以確定它確實是一個頭添加了警告禁用並試圖收集一些提示,可能是哪個頭。

1

另一種選擇是在文件的頂部#include小號 這將重置警告,defualt之後添加this

#pragma warning (defualt) 

,丟棄任何忽視這可能已被調用。

在另一個筆記上,我發現微軟的頭文件不太可能會禁用警告。

+0

該語法在VS 2008下被拒絕。它希望將特定警告重置爲默認值。因此,我必須使用#pragma warning(默認值:4244) 我可以找到的唯一標題是指4244: C:\ Program Files(x86)\ Microsoft Visual Studio 9.0 \ VC \ include \ comdef .h(30):#pragma warning(disable:4244) C:\ Program Files(x86)\ Microsoft Visual Studio 9.0 \ VC \ atlmfc \ include \ atldb.h(74):#pragma warning(disable:4244) C:\ Program Files(x86)\ Microsoft Visual Studio 9.0 \ VC \ atlmfc \ include \ atldbcli.h(38):#pragma warning(disable:4244) – Mordachai 2009-06-10 16:19:58