C4503 предупреждения? Как мне решить/избавиться от них?
-
10-10-2019 - |
Вопрос
Я впервые пробую C ++ STL. Я пытаюсь создать многомерный ассоциативный массив с помощью карты. Например:
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
Решение
Если вы собираетесь сохранить этот монстр структуры данных, вы мало что можете сделать с предупреждением, кроме как отключить его:
#pragma warning(disable:4503)
Другие советы
Я не фанат отключения предупреждения, потому что в соответствии с моим исследованием могут быть непреднамеренные последствия, возникшие в результате этого предупреждения, поэтому я предпочитаю по -настоящему распределить проблему.
Вот как я бы переписал код:
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.
Другие предложили, как вы можете отключить предупреждение. Я предлагаю вам переосмыслить ваш дизайн. Используйте больше абстракции, чем карта^5. Или изменить структуру данных хранилища. Например, используйте карту вместо карты^5.
Обновлено:
Я имею в виду, что у вас в основном есть два варианта:
Вы используете ключ с столько строк/уровнями, сколько вам нужно:
struct Key3 { std::string x, y, z; };
typedef std::map<Key3, DA*> MyMap;
Или вы строите что -то общее, где каждый уровень может удерживать либо значение DA*, и/или другой уровень.
Объявить таким образом (обратите внимание на готовые цитаты)
map<string, map<string, map<string, map<string, map<string, DA*> > > > > DATA;
C ++ распознает >>
как оператор смены.