2017-09-22 11 views
0

は、以下のコードを検討:なぜ列挙型の名前の前に列挙型の文字数があるのですか?

#include <iostream> 
#include <typeinfo> 

enum class Colors 
{ 
    Red, 
    Blue, 
    Green 
}; 

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

上記プログラムの出力は6Colorsあります。列挙型が「スコープではない」(classキーワードなしのenum)であっても、それは当てはまります。別の列挙型が定義されている場合、たとえばAnimalsの場合、その型名は7Animalsになります。これは将来考慮すべきものではありませんが、なぜコンパイラがそれを行うのかを知りたいと思っています。

+7

「上記のプログラムの出力は '6Colors'ある」---それが依存します実装(コンパイラのバージョン、プラットフォーム) – Brian

+3

これは「名前の変更」と呼ばれ、すべてのコンパイラには独自の方法があります(https://en.wikipedia.org/wiki/Name_mangling#How_different_compilers_mangle_the_same_functions)。 –

+0

Visual Studio 2017は "enum Colors"と "enum Animals"を出力します。 *恥ずかしがり屋*ブードゥー –

答えて

2

ネームスペースのスコープとタイプ情報、および名前をエンコードするように設計された、名前の変更された名前が表示されています。

ブーストは、あなたと遊ぶのは興味深いかもしれませんこれらの名を復号化する便利なクロスプラットフォームな方法があります。

#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; 
}