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

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

Susan Sarandon
Susan Sarandonオリジナル
2024-12-05 05:22:14166ブラウズ

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

GCC の typeid.name() の特殊性

typeid.name() 関数は、変数の型に関する情報を取得するためによく使用されます。または表現。ただし、GCC でコンパイルすると、この関数は予想される分解されていない型名の代わりに、一見意味不明な文字を返すことが観察されています。この動作は、より明確な表現を提供する Visual C などの他のコンパイラとは対照的です。

矛盾の背後にある理由

矛盾は typeid の実装にあります。 name()。コンパイラの実装によって定義されます。たとえば、GCC は装飾された名前を返します。これには、コンストラクターやデストラクターの名前や署名など、型に関する追加情報が含まれます。

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

装飾された文字列から読みやすい型名を取得するには、c filt や __cxa_demangle などのツールを使用できます。これらのツールは、装飾された名前を「デマングル」し、余分な情報を削除して、マングルされていない型名を残します。

例: c filt によるデマングル

#include <iostream>
#include <typeinfo>

using namespace std;

struct Blah {};

int main() {
  cout << c++filt::demangle(typeid(Blah).name()) << endl;
  return 0;
}

場合この変更されたコードをコンパイルして実行すると、目的のものが得られます。出力:

struct Blah

結論

GCC の typeid.name() 関数は最初は修飾された型名を返しますが、それをデマングルしてアンマングルされた型を取得することは可能です。 c filt や __cxa_demangle などのツールを使用して名前を付けます。 typeid.name() の実装定義の性質を理解することで、C コードで必要な型情報を効果的に取得できます。

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

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