2011-12-22 70 views
2

因此,4251警告至少是微軟編譯器的嚴重基礎。從本質上講,任何時候您在標題定義中的任何地方使用模板類或非dllexport類時都會得到此警告。更好的是,stl中有很多類(比如地圖),你甚至無法擺脫這個錯誤。爲什麼MSVC10忽略我的#pragma警告(禁用:4251)?

我的問題是,對於特定的類,「#pragma warning(disable:4251)」只是平坦的不起作用。它在其他地方工作,但在這裏。

DelWestInspectionProgram.cpp

#include "stdafx.h" 
#pragma warning(disable: 4251) 
... 

Output Log: 
E:\svn\VisionNow\VisionSuite\VI.Inspector.ImageProcessing.Common\BIImage.h(79): warning  C4251: 'BIImage::_data' : class 'boost::shared_array<T>' needs to have dll-interface to be used by clients of class 'BIImage' 
6>   with 
6>   [ 
6>    T=unsigned char 
6>   ] 
6>E:\svn\VisionNow\VisionSuite\VI.Inspector.ImageProcessing.Operators\BIImageOperator.h(25): warning C4251: 'BIImageOperator::_savePath' : class 'std::basic_string<_Elem,_Traits,_Ax>' needs to have dll-interface to be used by clients of class 'BIImageOperator' 
6>   with 
6>   [ 
6>    _Elem=char, 
6>    _Traits=std::char_traits<char>, 
6>    _Ax=std::allocator<char> 
6>   ] 

任何幫助將不勝感激。

+0

你把#pragma放在引起警告的頭文件中嗎?此外,如果正在編譯頭文件,則可能需要重新編譯預編譯頭。 – 2011-12-22 01:54:23

回答

2

根據我自己的經驗,有兩個問題:當它是一個DLL導入和它是一個DLL導出。

  1. 如果它是DLLEXPORT,微軟似乎忽略的#pragma警告,但是這僅僅是一個項目,這樣容易把到編譯器設置,以忽略此警告。我發現如果你把它放在那裏,微軟不會發出警告。

  2. 它在哪裏是dllimport,即使用您的標題的文件。我發現微軟不會忽視這個雜注,並且不會發出警告,所以把它放在兩個地方都能解決你的問題。

我的猜測是,壓制警告罰款的79個項目是那些不是DLL本身。

  1. 該警告可能是有原因的,即如果您的客戶端庫使用不同版本的boost或甚至不同的編譯器設置,則可能會中斷。
+0

感謝您的提示。我知道警告可能是出於某種原因,但使用任何類型的模板代碼都會使得警告更像一羣蒼蠅(令人討厭並使其他問題難以識別),而不是它自身的嚴重威脅。 – Mranz 2012-10-11 16:47:00

+0

如果您將#pragma放入您的標題中以取消警告,則在其周圍使用#pragma push和#pragma pop是「禮貌」的行爲,因此它只對本身的文件保持本地化,並且不會侵入您可能會遇到的其他標題希望保持警告。 – CashCow 2013-09-30 10:37:55

0

據我所知,一些錯誤不能被禁用。鏈接器就是這樣。因此,我認爲它也是一樣的編譯器。但通常我會把它放在你的stdafx.h文件中,或者至少在它之前。把它放在後面並不能保證什麼,特別是因爲我們看不到你的代碼。

[編輯]

在另一方面這是一個嚴重的警告,如果我是你,我會解決,而不是僅僅將其忽略。如果你在這裏搜索堆棧溢出,你會發現爲什麼它是一個問題的一些偉大的討論。

+1

放在'#include「stdafx.h」'之前的任何內容都將被忽略。最好把它放在stdafx.h本身的開始處。 – 2011-12-22 03:03:37

+0

我真的不能再發布任何代碼,因爲80個項目中的79個壓制警告的罰款,我似乎無法得到最後一個。我沒有真正看到有關此警告的嚴肅討論,而且我也知道有某些STL模板無法導出,如地圖。如果您有任何關於它的良好討論的鏈接,我會很樂意閱讀它們。 – Mranz 2011-12-27 22:03:00