C4503 предупреждения? Как мне решить/избавиться от них?

StackOverflow https://stackoverflow.com/questions/3994500

Вопрос

Я впервые пробую 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 ++ распознает >> как оператор смены.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top