197 votes

typeid et typeof en C++

Je me demande juste quelle est la différence entre typeid et typeof en C++ ?

typeid est défini dans le fichier d'en-tête standard de la bibliothèque C++ typeinfo.

typeof est défini dans l'extension GCC pour C ou en C++. Boost bibliothèque.


mettre à jour :

Merci !

le code de test suivant pour typeid ne donne pas le nom correct du type. quel est le problème ?

 //main.cpp 
 #include <iostream>  
 #include <typeinfo>  //for 'typeid' to work  

 class Person {  
 public:  
    // ... Person members ...  
    virtual ~Person() {}  
 };  

 class Employee : public Person {  
    // ... Employee members ...  
 };  

 int main () {  
    Person person;  
    Employee employee;  
    Person *ptr = &employee;  
    int t = 3;  

    std::cout << typeid(t).name() << std::endl;  
    std::cout << typeid(person).name() << std::endl;   // Person (statically known at compile-time)  
    std::cout << typeid(employee).name() << std::endl; // Employee (statically known at compile-time)  
    std::cout << typeid(ptr).name() << std::endl;      // Person * (statically known at compile-time)  
    std::cout << typeid(*ptr).name() << std::endl;     // Employee (looked up dynamically at run-time  
                                             // because it is the dereference of a pointer to a polymorphic class)  
 }  

sortie :

bash-3.2$ g++ -Wall main.cpp -o main  
bash-3.2$ ./main   
i  
6Person  
8Employee  
P6Person  
8Employee

249voto

AndreyT Points 139512

Le langage C++ n'a pas de typeof . Vous devez être en train de regarder une extension spécifique au compilateur. Si vous parlez de l'extension de GCC typeof alors une fonctionnalité similaire est présente dans C++11 à travers les mots-clés decltype y auto . Encore une fois, le C++ ne dispose pas d'une telle typeof mot-clé.

typeid est un opérateur du langage C++ qui renvoie des informations d'identification de type au moment de l'exécution. Il renvoie essentiellement un type_info qui est comparable, sur le plan de l'égalité, à d'autres type_info objets.

Notez, que la seule propriété définie de l'objet retourné type_info est le fait qu'il soit comparable en termes d'égalité et de non-égalité. type_info les objets décrivant des types différents doivent être comparés de manière non égale, alors que type_info les objets décrivant le même type doivent être comparables. Tout le reste est défini par l'implémentation. Les méthodes qui renvoient divers "noms" ne sont pas garanties de renvoyer quelque chose de lisible par l'homme, et même pas garanties de renvoyer quoi que ce soit du tout.

Notez aussi que ce qui précède implique probablement (bien que la norme ne semble pas le mentionner explicitement) que des applications consécutives de typeid au même type peuvent retourner des type_info (qui, bien sûr, doivent encore être comparés entre eux).

58voto

JaredPar Points 333733

La principale différence entre les deux est la suivante

  • typeof est une construction de compilation et renvoie le type tel qu'il est défini au moment de la compilation.
  • typeid est une construction d'exécution et donne donc des informations sur le type d'exécution de la valeur.

typeof Refenence : http://www.delorie.com/gnu/docs/gcc/gcc_36.html

typeid Rfeerence : http://en.wikipedia.org/wiki/Typeid

28voto

Brian Campbell Points 101107

typeid peut opérer au moment de l'exécution, et retourner un objet décrivant le type de l'objet au moment de l'exécution, qui doit être un pointeur vers un objet d'une classe avec des méthodes virtuelles pour que l'option RTTI (informations sur les types d'exécution) à stocker dans la classe. Il peut également donner le type au moment de la compilation d'une expression ou un nom de type, s'il ne s'agit pas d'un pointeur vers une classe contenant des informations sur le type au moment de l'exécution.

typeof est une extension GNU, et vous donne le type de toute expression au moment de la compilation. Cela peut être utile, par exemple, pour déclarer des variables temporaires dans des macros qui peuvent être utilisées sur plusieurs types. En C++, on utilise généralement modèles à la place.

27voto

AraK Points 38702

Répondre à la question supplémentaire :

mon code de test suivant pour typeid fait n'affiche pas le nom correct du type. Quel est le problème ?

Il n'y a rien de mal. Ce que vous voyez est la représentation en chaîne du nom du type. Le standard C++ ne force pas les compilateurs à émettre le nom exact de la classe, c'est juste à l'implémenteur (vendeur de compilateur) de décider ce qui est approprié. En bref, les noms sont à la discrétion du compilateur.


Ce sont deux outils différents. typeof renvoie le type d'une expression, mais ce n'est pas standard. En C++0x, il existe un élément appelé decltype qui fait le même travail AFAIK.

decltype(0xdeedbeef) number = 0; // number is of type int!
decltype(someArray[0]) element = someArray[0];

Considérant que typeid est utilisé avec les types polymorphes. Par exemple, disons que cat dérive animal :

animal* a = new cat; // animal has to have at least one virtual function
...
if( typeid(*a) == typeid(cat) )
{
    // the object is of type cat! but the pointer is base pointer.
}

5voto

Debasish Jana Points 1051

Typeid fournit le type des données au moment de l'exécution, lorsque cela est demandé. Typedef est une construction au moment de la compilation qui définit un nouveau type comme indiqué ensuite. Il n'y a pas de typeof en C++. La sortie apparaît sous la forme de (commentaires inscrits) :

std::cout << typeid(t).name() << std::endl;  // i
std::cout << typeid(person).name() << std::endl;   // 6Person
std::cout << typeid(employee).name() << std::endl; // 8Employee
std::cout << typeid(ptr).name() << std::endl;      // P6Person
std::cout << typeid(*ptr).name() << std::endl;     //8Employee

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X