web-dev-qa-db-ja.com

typeid.name()がGCCを使用して奇妙な文字を返すのはなぜですか?

このmain.cppを実行するとどうなりますか:

#include <iostream>
#include <typeinfo>

using namespace std;

struct Blah {};

int main() {
  cout << typeid(Blah).name() << endl;
  return 0;
}

GCCバージョン4.4.4でコンパイルすることにより:

g++ main.cpp

私はこれを得る:

4Blah

Visual C++ 2008では、次のようになります。

struct Blah

Blahまたはstruct Blahだけを印刷する方法はありますか?

43
sivabudh

nameの戻り値は実装定義です。実装は、異なるタイプの異なる文字列を返す必要さえありません。

G ++から得られるものは 装飾名 です。これは c++filt コマンドまたは __cxa_demangle

61
icecrime

返される文字列は実装定義です。

Gccがやっていることは、マングルされた名前を返すことです。
c ++ filtを使用して、マングルされた名前をプレーンテキストに変換できます。

> a.out | c++filt
17
Martin York

印刷する方法はありますか

Blahまたは_struct Blah_?

いいえ。std::typeinfo::name()の結果は指定されていません。さらに、すべての型に対して同じ文字列(または、実際、すべての型に対して空の文字列)を返す可能性があり、実装は依然として標準に準拠しています。その結果に頼ってはいけません。本当に、私が便利だと思ったのはデバッグだけでした。

必要なものを教えてください。多くの場合、代わりに特性が使用されます。

13
sbi

他の人が言ったように、ここでの結果はimplementation-definedです。つまり、実装(つまり、コンパイラツールチェーン)は、どこかに文書化されている限り、自由に定義できます。

C++標準のセクション18.5.1/1 [lib.type.info]から:

クラス type_infoは、実装によって生成される型情報を記述します。このクラスのオブジェクトは、タイプの名前へのポインターと、2つのタイプの同等性または照合順序の比較に適したエンコード値を効果的に格納します。型の名前、エンコード規則、および照合順序はすべて指定されておらず、プログラムによって異なる場合があります。

7
Adam Rosenfield

typeid().name()は実装依存です。すべてのタイプに対して空の文字列を返すこともあります。これはあまり有用な実装ではありませんが、有効です。

3
Juraj Blaho

4Blahでは、4はクラス名の文字数です。たとえば、クラス名がmyEmptyClassの場合、12myEmptyClassが出力されます。

2
Pradeep Rohilla