在使用Boost 1.4.9在VS 2010中编译以下C ++代码时,我收到一条C4503警告消息(超出装饰名称长度,名称被截断“,3次):
#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 :(得分:2)
似乎这是一个警告,助推器们已经决定压制Visual C ++编译器。
来自here:
警告:C4503装饰名称长度超过了
意见建议:抑制。 (注意\ boost \ config \ compiler \ visualc.hpp包含此全局&gt;抑制...)!抑制:#pragma warning(禁用: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
的Microsoft帮助示例如果您在推送后放置#pragma warning (disable:4503)
,则获取警告。如果您将置于之前,则会出现无警告。这意味着上面的代码会生成C4503警告,即使它已被禁用。
答案 1 :(得分:1)
Boost导致该错误很多,而IIRC(来自v 1.2ish)它会在升级库中管理被认为无害的警告。 你看到了这个警告,因为你正在做一些他们没想到的事情并搞砸他们的警告管理。
答案 2 :(得分:0)
pragma warning(pop)弹出推入堆栈的最后一个警告状态。您在推送和弹出之间对警告状态所做的任何更改都将被撤消。
撤消和弹出之间警告状态的任何更改都将被撤消。这意味着,无论boost-header本身所做的任何更改(并且它们显然都禁用了4503)都会被撤消。 您可以在弹出后恢复禁用4503。