当在Boost周围使用“#pragma警告”时,警告C4503包括

问题描述:

当在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

看起来好像它是一个警告提升家伙已决定压制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

Boost会导致该错误很多,并且IIRC(来自v 1.2ish)会管理被认为无害的boost库中的警告。 你正在看到这个警告,因为你正在做一些他们不期望的事情,并污染了他们的警告管理。

+0

我正在编译我的项目,警告级别为4,如果我在包含Boost头文件时没有选择性地用'#pragma'指令更改它,我会收到很多警告。有没有更好的方法来做到这一点? – 2012-03-12 15:02:33

正确回答这个问题,可以在MSDN documentation发现:

的编译警告(弹出)弹出最后警告状态压入堆栈。您对推送和弹出之间的警告状态所做的任何更改都已撤消。

推送和弹出之间的警告状态的任何更改都被撤消。这意味着,无论升级标题本身如何改变(并且它们显然禁用4503)都会被撤消。 您可以在弹出后恢复禁用4503。