type_info : comment est-elle instanciée ?

type_info : comment est-elle instanciée ? - C++ - Programmation

Marsh Posté le 27-12-2003 à 00:54:50    

bonjour,
 
je me pose des questions sur la classe : type_info
c'est apparement le type de retour de l'operateur typeid
 
j'ai trouvé sa déclaration dans un header de mon compilo :
 

Code :
  1. class type_info {
  2. public:
  3.     _CRTIMP virtual ~type_info();
  4.     _CRTIMP int operator==(const type_info& rhs) const;
  5.     _CRTIMP int operator!=(const type_info& rhs) const;
  6.     _CRTIMP int before(const type_info& rhs) const;
  7.     _CRTIMP const char* name() const;
  8.     _CRTIMP const char* raw_name() const;
  9. private:
  10.     void *_m_data;
  11.     char _m_d_name[1];
  12.     type_info(const type_info& rhs);
  13.     type_info& operator=(const type_info& rhs);
  14. };


 
elle n'a pas de constructeur par defaut, et son unique constructeur est privé, pourtant l'operateur typeid doit bien l'instancier ?
 
sinon, est-ce possible (techniquement, je parle pas de l'interet) de surcharger cet operateur typeid ?


---------------
-( BlackGoddess )-
Reply

Marsh Posté le 27-12-2003 à 00:54:50   

Reply

Marsh Posté le 27-12-2003 à 00:57:40    

cette implémentation est complètement dépendante de ton compilateur? si tu veux les manipuler, c'est pas const & et tu récupère ça avec l'opérateur typeid()

Reply

Marsh Posté le 27-12-2003 à 01:09:36    

name et raw_name sont des méthodes standards ? et leur résultat ?
 
par exemple avec mon compilo :
 

Code :
  1. struct Test
  2. {
  3. };
  4. void main()
  5. {
  6. Test t;
  7. cout << typeid(t).name() << endl; // va ecrire "struct Test"
  8. cout << typeid(&t).name() << endl; // va ecrire "struct Test *"
  9. }


 
et raw_name va renvoyer le nom décoré
 
le format de la réponse est-il standard ? les décorations ?


Message édité par blackgoddess le 27-12-2003 à 01:10:29

---------------
-( BlackGoddess )-
Reply

Marsh Posté le 27-12-2003 à 01:19:32    

1) int main
2) dans une certaine mesure oui. ceci est décrit dans l'ARM. les compilateurs ont la libertés de mettre en oeuvre des techniques de compression pour des raisons d'efficacité (un symbole brut C++ peut facilement faire 4Ko, ça fait très mal, imagine ce que ça ferait de faire une faute de page à chaque fois)

Reply

Marsh Posté le 27-12-2003 à 01:22:28    

normalement tu dois obtenir ceci
 
4Test
P4Test
 
l'utilitaire gnu c++filt permet de décrypter ses symboles (la convention est très simple, mais le mélange devient difficile à lire)
 

Reply

Marsh Posté le 27-12-2003 à 13:00:47    

j'obtiens
 
.?AUTest@@
.PAUTest@@
 
avec vc++7 :(


---------------
-( BlackGoddess )-
Reply

Marsh Posté le 01-01-2004 à 16:14:16    

ben spa normal, je crois bien que la norme impose bien une base commune

Reply

Marsh Posté le 01-01-2004 à 17:08:43    

ceux qui voudraient bien pourraient tester ceci et dire leur compilo + le resultat svp ?
 

Code :
  1. struct Test
  2. {
  3. };
  4.  
  5. int main()
  6. {
  7.   Test t;
  8.   cout << typeid(t).raw_name() << endl;
  9.   cout << typeid(&t).raw_name() << endl;
  10. }


 
merci :)


---------------
-( BlackGoddess )-
Reply

Marsh Posté le 01-01-2004 à 17:23:34    

BlackGoddess a écrit :

ceux qui voudraient bien pourraient tester ceci et dire leur compilo + le resultat svp ?
 

Code :
  1. struct Test
  2. {
  3. };
  4.  
  5. int main()
  6. {
  7.   Test t;
  8.   cout << typeid(t).raw_name() << endl;
  9.   cout << typeid(&t).raw_name() << endl;
  10. }


 
merci :)


 

Code :
  1. typeinfo.cpp: In function `int main()':
  2. typeinfo.cpp:8: error: `cout' undeclared (first use this function)
  3. typeinfo.cpp:8: error: (Each undeclared identifier is reported only once for each function it appears in.)
  4. typeinfo.cpp:8: error: must #include <typeinfo> before using typeid
  5. typeinfo.cpp:8: error: `endl' undeclared (first use this function)
  6. typeinfo.cpp:9: error: must #include <typeinfo> before using typeid


 
 
:whistle:
 
Abstraction faite de ces quelques problèmes, GCC 3.3.1 ne connais pas raw_name du tout

Reply

Marsh Posté le 01-01-2004 à 17:51:54    

Resultat sous Visual 6
.?AUTest@@
.PAUTest@@
Press any key to continue

Reply

Marsh Posté le 01-01-2004 à 17:51:54   

Reply

Marsh Posté le 01-01-2004 à 18:15:31    

1) raw_name n'existe pas
2) la norme de codage de VC est complètement à part apparemment, ce qui explique le gros bordel que c'est de linker autre chose que du VC avec du VC.
sinon voir dans l'ARM 7.2.1c pour quelque chopse de moins fantasque et suivi par g++
 
 
t -> 4Test 4 étant la longueur du nom
&t -> P4Test le P représentant la nature pointeur

Reply

Marsh Posté le 01-01-2004 à 20:27:42    

merci :) v me documenter :p


---------------
-( BlackGoddess )-
Reply

Marsh Posté le 02-01-2004 à 02:31:24    

VC++ 6 et VC++ .NET:  
.?AUTest@@
.PAUTest@@
 
(Passé un max de temps a configurer VC++ .NET pour 1) faire une appli en mode console [le wizard est pas installe par defaut] et 2) virer les options tenant absolument a linker le code avec les MFC.
A+,


Message édité par gilou le 02-01-2004 à 02:32:38

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 02-01-2004 à 09:26:36    

oui c'est vrai que c'est lourd les MFC ... par contre le wizard c'est bizard j'ai fait 2 install par defaut (vs.net 2002) et il était installé ...
 
merci pour les réponses :)


---------------
-( BlackGoddess )-
Reply

Marsh Posté le 02-01-2004 à 09:27:39    

sinon pour la compilation avec VC++ on dirait qu'il décore les noms comme il le fait pour son linker, ou comme il le fait quand on exporte des classes d'une dll par exemple ...


---------------
-( BlackGoddess )-
Reply

Marsh Posté le 02-01-2004 à 10:32:23    

blackgoddess a écrit :

oui c'est vrai que c'est lourd les MFC ... par contre le wizard c'est bizard j'ai fait 2 install par defaut (vs.net 2002) et il était installé ...
 
merci pour les réponses :)

Tu avais le wizard pour une appli console en VC++ .NET installé par defaut?? J'utilise VC++ .NET 2002 aussi pourtant. Installé lors de l'install de VS .NET Enterprise Architect.
Je me souviens plus de mes options d'install, alors ca peut venir de la. Mais si tu as le meme wizard que moi (installé a lal pogne donc), il genere automatiquement des fichiers  stdafx.h et stdafx.cpp, sauf si a la creation du projet tu penses a changer les options et cliquer sur la check-box pour projet vide (dans une page secondaire).
 
A+,


Message édité par gilou le 02-01-2004 à 10:34:50

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 02-01-2004 à 11:02:39    

oui, c'est bien le même wizard (vs.net pro)


---------------
-( BlackGoddess )-
Reply

Marsh Posté le 01-05-2004 à 10:14:41    

La méthode name renvoie un resultat non standart. Ca dépend de l'implémentation du compilo, et chaque compilo est libre de choisir le nom qu'il souhaite.
Raw_name est propre à certains compilo tel que VC et n'est pas standart. Il renvoie un nom codé en RAW.

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed