ホームページ >バックエンド開発 >C++ >GCC の `typeid.name()` が奇妙な型名を返すのはなぜですか?それを修正するにはどうすればよいですか?

GCC の `typeid.name()` が奇妙な型名を返すのはなぜですか?それを修正するにはどうすればよいですか?

DDD
DDDオリジナル
2024-11-30 14:59:11437ブラウズ

Why Does GCC's `typeid.name()` Return Weird Type Names, and How Can I Fix It?

typeid.name() を使用して GCC の奇妙な型名出力を解明する

C で型情報を扱う場合、typeid.name() は、タイプの名前。ただし、GCC を使用すると、開発者はその出力に複雑な文字が含まれることに遭遇しました。この記事では、この動作の背後にある理由を詳しく調べ、マングルされていない型名を取得する方法を検討します。

装飾名の謎

デフォルトでは、GCC は型の「装飾名」を返します。これには次のものが含まれます。追加情報であり、人間が判読できるものではありません。これは、次のコード スニペットに例示されています。

#include <iostream>
#include <typeinfo>

struct Blah {};

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

GCC でコンパイルすると、コードは予期される "Blah" ではなく "4Blah" を出力します。これは、GCC がパラメーターやサイズなどの型関連の情報を名前に追加しているためです。

修飾された名前のデマングリング

マングル化されていない名前を取得するには、「デマングリング」と呼ばれるプロセスを適用する必要があります。 。」 GCC は、この目的のために __cxa_demangle() 関数とコマンドライン ツール c filt を提供します。

次のコードは、修飾された名前をデマングルする方法を示しています。

#include <iostream>
#include <typeinfo>

int main() {
  const char* decorated_name = typeid(Blah).name();
  char* unmangled_name = abi::__cxa_demangle(decorated_name, nullptr, nullptr, nullptr); // Windows: _ZNKSt7__cxxabiv117__class_type_info9can_catchEPv
  if (unmangled_name) {
    cout << unmangled_name << endl;
    free(unmangled_name);
  } else {
    cout << "Demangling failed" << endl;
  }  
  return 0;
}

コンパイル時GCC を使用すると、このコードは次のように「Blah」を出力します。

結論

typeid.name() は C で型情報を取得するための貴重なツールですが、GCC が型名をどのようにマングルするかを理解することが重要です。上記のデマングリング手法を活用することで、開発者は人間が判読できる型の名前を抽出し、デバッグと分析を簡素化できます。

以上がGCC の `typeid.name()` が奇妙な型名を返すのはなぜですか?それを修正するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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