GCC での Typeid.name() の動作とデマングリング手法
typeid 演算子を使用すると、開発者は typeid の出力の違いに遭遇します。 name() は使用するコンパイラに応じて異なります。この記事では、GCC でこの問題が発生する理由と、マングルされていない型名を出力するための問題を解決する方法について説明します。
GCC と Visual C : 型名の表示
例ただし、GCC (バージョン 4.4.4) は typeid(Blah).name() を呼び出すと「4Blah」を返しますが、Visual C 2008 は「struct Blah」を表示します。この不一致は、GCC が装飾型名を返したことによるものです。
GCC の装飾型名
typeid 演算子の実装は統一的に定義されていません。 GCC の場合、装飾された型名が返されます。これには、型のサイズや配置などの追加情報が含まれます。
装飾された名前の分割
分割された名前を取得するには型名を使用する場合、ユーザーは修飾された名前を分解する必要があります。これは、さまざまなツールを使用して実行できます:
デマングリングの適用
GCC では、次のコマンドを実行して装飾名 "4Blah" をデマングルできます:
g++ -fno-rtti -no-pie -o main main.cpp ./main | c++filt
このコマンドは、分解された型名として「struct Blah」を出力します。 __cxa_demangle() 関数をコードに統合することも、装飾された名前をプログラムでデマングリングするためのオプションです。
以上がGCC で `typeid.name()` が異なる出力を生成するのはなぜですか? それをデマングルするにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。