2011-05-23 74 views
3

我想用/ Wall編譯我的項目。VC++ 2010:用/ Wall編譯

當我這樣做時,我從第三方代碼(boost庫,其他系統頭文件)中得到大量警告。我包含這些第三方頭文件的唯一地方是在我的預編譯頭文件(stdafx.h)中。

我想這(在stdafx.h

#pragma warning(push,3) 
    // include all the third-party headers here 
#pragma warning(pop) 

編譯級警告所有的第三方代碼3.

但是我還是得到數百警告來自像math.hvector文件,xmemorystring_generator.hpp(boost.uuid),placeholders.hpp(boost.asio),...

如何確保編譯所有含有警告級別3的第三方代碼,同時comp在啓用所有警告的情況下激活我自己的代碼?

+0

一些警告只是愚蠢的,像警告說現在沒有用的東西現在已經修復。你將不得不禁用選擇警告。看到這個問題[http://stackoverflow.com/questions/4292352/msvc-stop-warnings-in-headers](http://stackoverflow.com/questions/4292352/msvc-stop-warnings-in-headers) 。 –

回答

1

第三方代碼修改的頻率較低,所以最好將所有這些包含在StdAfx.h中,然後您的上述解決方案將抑制其警告。

要麼是這樣做,要麼創建一些其他包裝頭文件,這些包裝頭文件在使用的庫的實際包含的周圍使用上述編譯指示。

我想不出第三種方法。我說他們都在stdafx(他們實際包括在其中,請記住,stdafx是一個優化 - 而不是一個精心選擇包括在您的源文件中的替代品)

+0

正如我在我的問題中提到的,所有第三方頭文件都只包含在'stdafx.h'中。在我的源文件中,我只包含'stdafx.h'和我自己的特定於項目的頭文件,這些頭文件可能會更頻繁地更改。所以我不明白爲什麼我仍然從第三方代碼中獲得警告,即使我使用'#pragma warning(push,3)'附上了所有這些包含的警告。 –

+1

你有多確定沒有其他包括偷偷溜進那裏?也許你有一些自動包含一些東西的編譯器開關?當你編譯stdafx.cpp時會發生什麼?你有警告嗎?如果沒有,編譯一個只包含stdafx.h的空的.cpp文件會發生什麼?您可以以這種方式向後工作,直到找出這些包含實際發生的位置。 –

+1

另外,您可能希望使用此編譯器開關來查看包含的實際工作方式:http://msdn.microsoft.com/en-us/library/hdkef6tk.aspx –

0

檢查所有包含你的文件會拉入。可能是其中一個可能會將警告重置爲默認狀態。我已經看到了VC++自帶的MFC或ATL頭文件 - 一些警告被禁用,然後使用「默認」調用說明符重新啓用,而不是使用push/pop對。

1

/W4比/ Wall更真實。我經常在/ W4中使用stl,tr1和windows頭文件。我不知道有關提升。

用#pragma包裝頭文件的原因還不夠,當實例化模板或擴展宏(或者甚至是內聯)時會生成一些警告。