C4503 warnings? How do i solve/get rid of them?

别说谁变了你拦得住时间么 提交于 2020-01-03 08:29:34

问题


It's my first time trying out C++ STL. I'm trying to build a multidimensional associative array using map. For example:

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;
}

When compiling the code above in VS2005, I got 170 of C4503 warnings. All of the warnings are about "decorated name length exceeded, name was truncated". The program seems to run fine though.

Anyone care to spare some time to explain to me what caused these warnings and how do i solve em? thanks in advance :)

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

回答1:


If you intend to keep this monster of a data structure, there is little you can do about the warning other than disable it:

#pragma warning(disable:4503)



回答2:


I'm not a fan of disabling the warning, because per my research, there could be unintended consequences resulting from this warning, so I prefer to truly dispense of the issue.

Here's how I would rewrite the code:

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;
};   

and you could use it like this:

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

My concerns and ultimate solution primarily derive from MSDN.




回答3:


Others have suggested how you could disable the warning. I suggest that you rethink your design instead. Use some more abstraction than map^5. Or change the data structure of the storage. E.g. use map instead of map^5.

Updated:

What I mean is that you basically have two options:

  • You use a key with as many strings/levels as you need:

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

  • Or you build something generic, where each level can hold either the DA* value and/or another level.




回答4:


Declare in such way( pay attention to finished quotes)

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

C++ recognizes >> as shift operator.



来源:https://stackoverflow.com/questions/3994500/c4503-warnings-how-do-i-solve-get-rid-of-them

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!