2017-09-22 1 views
0

Consultez le code suivant:Pourquoi les noms de types d'énumération sont précédés du nombre de caractères dans le nom de l'énumération?

#include <iostream> 
#include <typeinfo> 

enum class Colors 
{ 
    Red, 
    Blue, 
    Green 
}; 

int main() 
{ 
    std::cout << typeid(Colors::Red).name(); 
    return 0; 
} 

La sortie du programme ci-dessus est 6Colors. Cela est vrai même si l'énumération est "non délimitée" (enum sans le mot-clé class). Lorsqu'une autre énumération est définie, par exemple Animals, son nom de type devient 7Animals. Bien que cela puisse difficilement être quelque chose à considérer dans le futur, je suis curieux de savoir pourquoi le compilateur fait cela.

+7

« La sortie du programme ci-dessus est' 6Colors' » --- cela dépend de la implémentation (version du compilateur, plateforme) – Brian

+3

Ceci est appelé "name mangling", et chaque compilateur [a sa propre façon de le faire] (https://en.wikipedia.org/wiki/Name_mangling#How_different_compilers_mangle_the_same_functions). –

+0

Visual Studio 2017 sort «enum Colors» et «enum Animals». * hausser les épaules * Voodoo –

Répondre

2

Vous voyez un nom tronqué - qui est conçu pour coder l'étendue de l'espace de noms et les informations de type ainsi que le nom.

Boost a une façon multi-plateforme pratique de demangling ces noms que vous trouverez peut-être intéressant de jouer avec:

#include <iostream> 
#include <typeinfo> 
#include <boost/core/demangle.hpp> 

enum class Colors 
{ 
    Red, 
    Blue, 
    Green 
}; 

int main() 
{ 
    std::cout << boost::core::demangle(typeid(Colors::Red).name()); 

    return 0; 
}