在Boost包含时使用“#pragma warning”警告C4503

时间:2012-03-12 14:35:20

标签: c++ visual-studio-2010 boost

在使用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指令时,警告才会消失。对此有解释,还是编译器有错误?

3 个答案:

答案 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)

可以在MSDN documentation

中找到此问题的正确答案
  

pragma warning(pop)弹出推入堆栈的最后一个警告状态。您在推送和弹出之间对警告状态所做的任何更改都将被撤消。

撤消和弹出之间警告状态的任何更改都将被撤消。这意味着,无论boost-header本身所做的任何更改(并且它们显然都禁用了4503)都会被撤消。 您可以在弹出后恢复禁用4503。