C4503警告?我如何解决/摆脱它们?

时间:2010-10-22 06:43:15

标签: c++ string stl map name-decoration

这是我第一次尝试使用C ++ STL。我正在尝试使用map构建一个多维关联数组。例如:

typedef struct DA {
    string  read_mode;
    string  data_type;
    void    *pValue;
    void    *pVarMemLoc;
}DA;

int main()
{
    map<string, map<string, map<string, map<string, map<string, DA*>>>>> DATA;

    DATA["lvl1"]["stg1"]["flr1"]["dep1"]["rom1"] = new DA;
    DATA["lvl1"]["stg1"]["flr1"]["dep1"]["rom2"] = new DA;
    DATA["lvl1"]["stg1"]["flr1"]["dep1"]["rom3"] = new DA;

    IEC["lvl1"]["stg1"]["flr1"]["dep1"]["rom1"]->read_mode = "file";
    IEC["lvl1"]["stg1"]["flr1"]["dep1"]["rom2"]->read_mode = "poll";
    IEC["lvl1"]["stg1"]["flr1"]["dep1"]["rom3"]->read_mode = "report";

    return 0;
}

在VS2005中编译上面的代码时,我收到了170个C4503警告。 所有警告都是关于“超出装饰名称长度,名称被截断”。 该计划似乎运行良好。

任何人都要花些时间向我解释是什么原因引起了这些警告,我该如何解决这些警告?提前谢谢:)

Warning 1   warning C4503: 'std::map<_Kty,_Ty>::~map' : decorated name length exceeded, name was truncated  c:\program files\microsoft visual studio 8\vc\atlmfc\include\cstringt.h 2121
Warning 2   warning C4503: 'std::map<_Kty,_Ty>::map' : decorated name length exceeded, name was truncated   c:\program files\microsoft visual studio 8\vc\atlmfc\include\cstringt.h 2121
Warning 3   warning C4503: 'std::map<_Kty,_Ty>::operator []' : decorated name length exceeded, name was truncated   c:\program files\microsoft visual studio 8\vc\atlmfc\include\cstringt.h 2121
Warning 4   warning C4503: 'std::_Tree<_Traits>::~_Tree' : decorated name length exceeded, name was truncated   c:\program files\microsoft visual studio 8\vc\atlmfc\include\cstringt.h 2121
Warning 5   warning C4503: 'std::map<_Kty,_Ty>::operator []' : decorated name length exceeded, name was truncated   c:\program files\microsoft visual studio 8\vc\atlmfc\include\cstringt.h 2121
Warning 6   warning C4503: 'std::_Tree<_Traits>::iterator::~iterator' : decorated name length exceeded, name was truncated  c:\program files\microsoft visual studio 8\vc\atlmfc\include\cstringt.h 2121
Warning 7   warning C4503: 'std::_Tree<_Traits>::iterator::iterator' : decorated name length exceeded, name was truncated   c:\program files\microsoft visual studio 8\vc\atlmfc\include\cstringt.h 2121

4 个答案:

答案 0 :(得分:8)

我不是禁用警告的粉丝,因为根据我的研究,这个警告可能会产生意想不到的后果,所以我更愿意真正解决这个问题。

以下是我将如何重写代码:

typedef struct DA {
    string  read_mode;
    string  data_type;
    void    *pValue;
    void    *pVarMemLoc;
}DA;
struct ROOM{
    map<string, DA*> map;
};
struct DEPARTMENT{
    map<string, ROOM> map;
};
struct FLOOR{
    map<string, DEPARTMENT> map;
};
struct STAGE{
    map<string, FLOOR> map;
};   
struct LEVEL{
    map<string, STAGE> map;
};   

你可以像这样使用它:

int main()
{
    LEVEL DATA;

    DATA.map["lvl1"].map["stg1"].map["flr1"].map["dep1"].map["rom1"] = new DA;
    DATA.map["lvl1"].map["stg1"].map["flr1"].map["dep1"].map["rom2"] = new DA;
    DATA.map["lvl1"].map["stg1"].map["flr1"].map["dep1"].map["rom3"] = new DA;

    ...
    etc

我的担忧和最终解决方案主要来自MSDN

答案 1 :(得分:7)

如果你打算保留这个数据结构的怪物,除了禁用它之外你几乎没有关于警告的事情:

#pragma warning(disable:4503)

答案 2 :(得分:5)

其他人建议你如何禁用警告。我建议你重新考虑你的设计。使用比map ^ 5更多的抽象。或者更改存储的数据结构。例如。使用地图代替地图^ 5.

<强>更新

我的意思是你基本上有两种选择:

  • 您可以根据需要使用具有多个字符串/级别的密钥:

    struct Key3 { std::string x, y, z; }; typedef std::map<Key3, DA*> MyMap;

  • 或者您构建了一些通用的东西,其中每个级别都可以包含DA *值和/或其他级别。

答案 3 :(得分:-3)

以这种方式宣告(注意完成的报价)

map<string, map<string, map<string, map<string, map<string, DA*> > > > > DATA;

C ++将>>识别为移位运算符。