avertissements C4503? Comment puis-je résoudre / se débarrasser d'eux?
-
10-10-2019 - |
Question
Il est ma première fois d'essayer la STL de C. Je suis en train de construire un tableau associatif multidimensionnel en utilisant la carte. Par exemple:
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;
}
Lors de la compilation du code ci-dessus dans VS2005, je suis arrivé 170 des avertissements C4503. Toutes les mises en garde sont de « longueur du nom décoré dépassé, le nom a été tronqué ». Le programme semble fonctionner très bien si.
Quelqu'un veut d'épargner un certain temps pour me expliquer ce qui a causé ces avertissements et comment puis-je résoudre em? merci à l'avance:)
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
La solution
Si vous avez l'intention de garder ce monstre d'une structure de données, il y a peu, vous pouvez faire l'avertissement autre que le désactiver:
#pragma warning(disable:4503)
Autres conseils
Je ne suis pas fan de désactiver l'avertissement, parce que par mes recherches, il pourrait y avoir des conséquences non intentionnelles résultant de cet avertissement, donc je préfère vraiment la question de distribution.
Voici comment je réécrire le 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;
};
et vous pouvez l'utiliser comme ceci:
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
Mes préoccupations et solution ultime découlent principalement de MSDN .
D'autres ont suggéré comment vous pouvez désactiver l'avertissement. Je suggère que vous repensez à la place de votre conception. Utilisez un peu plus abstraction que la carte ^ 5. Ou changer la structure de données de stockage. Par exemple. utiliser la carte au lieu de carte ^ 5.
Mise à jour:
Qu'est-ce que je veux dire est que vous avez essentiellement deux options:
-
Vous utilisez une clé avec autant de chaînes / niveaux que vous avez besoin:
struct Key3 { std::string x, y, z; };
typedef std::map<Key3, DA*> MyMap;
-
Ou vous construisez quelque chose de générique, où chaque niveau peut contenir soit la DA * valeur et / ou un autre niveau.
Declare de telle manière (attention à des citations finis)
map<string, map<string, map<string, map<string, map<string, DA*> > > > > DATA;
C ++ reconnaît >>
comme opérateur de décalage.