C4503 предупреждения?Как мне решить / избавиться от них? - PullRequest
8 голосов
/ 22 октября 2010

Я впервые пробую 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

Ответы [ 4 ]

8 голосов
/ 27 февраля 2014

Я не фанат отключения предупреждения, потому что согласно моему исследованию могут быть непредвиденные последствия, вытекающие из этого предупреждения, поэтому я предпочитаю по-настоящему решить проблему.

Вот как я бы переписалкод:

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 .

7 голосов
/ 22 октября 2010

Если вы намереваетесь сохранить этого монстра в структуре данных, вы мало что можете сделать с предупреждением, кроме его отключения:

#pragma warning(disable:4503)
5 голосов
/ 22 октября 2010

Другие предложили, как вы можете отключить предупреждение. Я предлагаю вам переосмыслить свой дизайн. Используйте больше абстракций, чем map ^ 5. Или измените структуру данных хранилища. Например. используйте карту вместо карты ^ 5.

Обновлен:

Я имею в виду, что у вас есть два варианта:

  • Вы используете ключ с таким количеством строк / уровней, сколько вам нужно:

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

  • Или вы создаете что-то общее, где каждый уровень может содержать значение DA * и / или другой уровень.

0 голосов
/ 22 октября 2010

Объявите таким образом (обратите внимание на готовые цитаты)

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

C ++ распознает >> как оператор сдвига.

...