ホームページ >バックエンド開発 >C++ >GCC で `typeid.name()` が異なる出力を生成するのはなぜですか? それをデマングルするにはどうすればよいですか?

GCC で `typeid.name()` が異なる出力を生成するのはなぜですか? それをデマングルするにはどうすればよいですか?

Susan Sarandon
Susan Sarandonオリジナル
2024-11-21 07:20:10382ブラウズ

Why Does `typeid.name()` Produce Different Output in GCC and How Can I Demangle It?

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 の場合、装飾された型名が返されます。これには、型のサイズや配置などの追加情報が含まれます。

装飾された名前の分割

分割された名前を取得するには型名を使用する場合、ユーザーは修飾された名前を分解する必要があります。これは、さまざまなツールを使用して実行できます:

  • c filt コマンド: 装飾された名前をデマングルするコマンドライン ユーティリティ。
  • __cxa_demangle() 関数: を実行する C 関数demangling.

デマングリングの適用

GCC では、次のコマンドを実行して装飾名 "4Blah" をデマングルできます:

g++ -fno-rtti -no-pie -o main main.cpp
./main | c++filt

このコマンドは、分解された型名として「struct Blah」を出力します。 __cxa_demangle() 関数をコードに統合することも、装飾された名前をプログラムでデマングリングするためのオプションです。

以上がGCC で `typeid.name()` が異なる出力を生成するのはなぜですか? それをデマングルするにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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