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 サイトの他の関連記事を参照してください。