当在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
指令的事情。有没有解释,或编译器有错误?
看起来好像它是一个警告提升家伙已决定压制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警告,即使它已被禁用。
因此,忽略此警告是否合理安全? – 2012-03-12 19:47:22
Boost会导致该错误很多,并且IIRC(来自v 1.2ish)会管理被认为无害的boost库中的警告。 你正在看到这个警告,因为你正在做一些他们不期望的事情,并污染了他们的警告管理。
我正在编译我的项目,警告级别为4,如果我在包含Boost头文件时没有选择性地用'#pragma'指令更改它,我会收到很多警告。有没有更好的方法来做到这一点? – 2012-03-12 15:02:33
正确回答这个问题,可以在MSDN documentation发现:
的编译警告(弹出)弹出最后警告状态压入堆栈。您对推送和弹出之间的警告状态所做的任何更改都已撤消。
推送和弹出之间的警告状态的任何更改都被撤消。这意味着,无论升级标题本身如何改变(并且它们显然禁用4503)都会被撤消。 您可以在弹出后恢复禁用4503。
Boost试图为不同编译器压制不必要的警告。如果您看到很多这些信息,请使用特定的编译器,警告级别和标题来触发警告,并提交错误报告。 – pmr 2012-03-12 15:45:28
在我意识到它与全球变暖无关之前,我必须三次阅读这个问题。 – Ferruccio 2012-03-12 19:25:17
谢谢,我改变了标题。 – 2012-03-12 19:35:38