2012-03-12 71 views
1

當在VS 2010中使用Boost 1.4編譯以下C++代碼時,我收到C4503警告消息(「裝飾名稱長度超出,名稱被截斷」,3次)。 9:當在Boost周圍使用「#pragma警告」時,警告C4503包括

#include <vector> 
#include <map> 

#pragma warning (push, 1) 
#include <boost/units/quantity.hpp> 
#include <boost/units/si/plane_angle.hpp> 
#pragma warning (pop) 

using namespace boost::units; 

typedef std::pair<quantity<si::plane_angle>, quantity<si::plane_angle> > Section; 

std::vector<Section> getEmptyVector() 
{ 
    std::vector<Section> sections; 
    return sections; 
} 

這讓我爲難的是,報警消失,只有當我刪除#pragma指令的事情。有沒有解釋,或編譯器有錯誤?

+0

Boost試圖爲不同編譯器壓制不必要的警告。如果您看到很多這些信息,請使用特定的編譯器,警告級別和標題來觸發警告,並提交錯誤報告。 – pmr 2012-03-12 15:45:28

+1

在我意識到它與全球變暖無關之前,我必須三次閱讀這個問題。 – Ferruccio 2012-03-12 19:25:17

+0

謝謝,我改變了標題。 – 2012-03-12 19:35:38

回答

2

看起來好像它是一個警告提升傢伙已決定壓制Visual C++編譯器。

here

警告:C4503修飾名長度超過
建議:禁止。 (請注意,\ boost \ config \ compiler \ visualc.hpp包含此全局>抑制...)!抑制:#pragma警告(禁用:4503)

現在是編譯器。注意下面的代碼:

#pragma warning (push, 1) 
#pragma warning (disable:4503) 

// C4503.cpp 
// compile with: /W1 /EHsc /c 
// C4503 expected 
#include <string> 
#include <map> 

class Field{}; 

typedef std::map<std::string, Field> Screen; 
typedef std::map<std::string, Screen> WebApp; 
typedef std::map<std::string, WebApp> WebAppTest; 
typedef std::map<std::string, WebAppTest> Hello; 
Hello MyWAT; 

#pragma warning (pop) 

我只是調整了微軟的幫助例如該warning

如果你把#pragma warning (disable:4503)推,你得到警告。如果你在之前加,有沒有警告。這意味着上面的代碼會生成C4503警告,即使它已被禁用。

+0

因此,忽略此警告是否合理安全? – 2012-03-12 19:47:22

0

Boost會導致該錯誤很多,並且IIRC(來自v 1.2ish)會管理被認爲無害的boost庫中的警告。 你正在看到這個警告,因爲你正在做一些他們不期望的事情,並污染了他們的警告管理。

+0

我正在編譯我的項目,警告級別爲4,如果我在包含Boost頭文件時沒有選擇性地用'#pragma'指令更改它,我會收到很多警告。有沒有更好的方法來做到這一點? – 2012-03-12 15:02:33

0

正確回答這個問題,可以在MSDN documentation發現:

的編譯警告(彈出)彈出最後警告狀態壓入堆棧。您對推送和彈出之間的警告狀態所做的任何更改都已撤消。

推送和彈出之間的警告狀態的任何更改都被撤消。這意味着,無論升級標題本身如何改變(並且它們顯然禁用4503)都會被撤消。 您可以在彈出後恢復禁用4503。