ホームページ  >  記事  >  バックエンド開発  >  GCC の `typeid.name()` が単純な型名ではなく、壊れた名前を返すのはなぜですか?

GCC の `typeid.name()` が単純な型名ではなく、壊れた名前を返すのはなぜですか?

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2024-11-22 11:50:12757ブラウズ

Why Does GCC's `typeid.name()` Return Mangled Names Instead of Plain Type Names?

GCC のマングルされた型名: 'typeid.name()' の難題を解明する

'typeid.name()' 関数を使用する場合GCC を使用すると、ユーザーは GCC が返す独特の文字列に驚くかもしれません。マングルされていないクラス名や構造体名を提供する他のコンパイラとは異なり、GCC は、潜在的な困惑に満ちた装飾名を出力します。

問題の詳細

次の C コードを考えてみましょう。

#include <iostream>
#include <typeinfo>

using namespace std;

struct Blah {};

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

このコードを GCC 4.4.4 でコンパイルすると、次のようになります。困惑する結果:

4Blah

対照的に、Visual C 2008 では次の結果が返されます:

struct Blah

謎の解明

その理由矛盾は、「typeid.name()」の実装定義の性質にあります。実装では、異なる型に対して異なる文字列を返すことも、異なる型に対して同一の文字列を返すことも選択できます。

GCC の装飾名

GCC は、設計上、次の装飾名を返します。タイプ情報。この装飾名は、名前や関連するテンプレート引数など、型に関するさまざまな詳細を含む複雑な文字列です。

装飾名の解読

GCC の意味を理解するには装飾名を使用するには、「c filt」コマンドまたは「__cxa_demangle」関数を使用できます。これらのツールを使用すると、修飾された名前をデマングリングでき、基礎となるマングルされていないクラス名または構造体名が明らかになります。

結論

'typeid.name()' の動作は異なる場合があります。コンパイラ間で、その戻り値の実装定義の性質を認識することが重要です。 GCC の場合、装飾された名前が返されるため、読みやすくするためにデマングルするための特殊なツールが必要です。

以上がGCC の `typeid.name()` が単純な型名ではなく、壊れた名前を返すのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。