ホームページ > バックエンド開発 > C++ > C で std::type_info::name をデマングルして基になる型を明らかにするにはどうすればよいですか?

C で std::type_info::name をデマングルして基になる型を明らかにするにはどうすればよいですか?

Barbara Streisand
リリース: 2024-12-10 11:38:11
オリジナル
402 人が閲覧しました

How can I demangle std::type_info::name to reveal the underlying type in C  ?

std::type_info::name の解読: 謎を解いた名前を明らかにする

std::type_info によって解読された名前は謎のままですそのため、基になる型を理解することが困難になります。この謎を解明する解決策の探求は、さまざまなアプローチの探求につながりました。

マングルされた名前の解読

1 つのソリューションは、C 11 の強力な機能と g ' を活用します。 ■ abi::__cxa_demangle 関数による libstdc ライブラリ。この関数は、マングルされた名前をデコードし、人間が判読できる文字列を返します。

C 11 実装

C 11 実装では、マングル解除関数は「type」に含まれています。 .hpp」ヘッダー ファイルであり、実際のデマングリング ロジックは「type.cpp」にあります。次のコード スニペットは次のことを示しています。

#include "type.hpp"

std::string demangle(const char* name) {

    int status = -4; 
    std::unique_ptr<char, void(*)(void*)> res {
        abi::__cxa_demangle(name, NULL, NULL, &status),
        std::free
    };

    return (status==0) ? res.get() : name ;
}
ログイン後にコピー

C 98 互換バージョン

C 11 を利用していない場合は、代替バージョンが引き続き利用可能です。 「type.cpp」の C 98 互換実装では、別の手法を使用して名前をデマングルします。

#include "type.hpp"

struct handle {
    char* p;
    handle(char* ptr) : p(ptr) { }
    ~handle() { std::free(p); }
};

std::string demangle(const char* name) {

    int status = -4; 
    handle result( abi::__cxa_demangle(name, NULL, NULL, &status) );

    return (status==0) ? result.p : name ;
}
ログイン後にコピー

使用法と考慮事項

デマングルされた名前は取得できます。 type 関数を使用します。この関数は、デマングルされる型への参照を受け取ります。次のコードは、その使用法を示しています。

#include "type.hpp"
struct Base { virtual ~Base() {} };
struct Derived : public Base { };

int main() {
    Base* ptr_base = new Derived();
    std::cout << "Type of ptr_base: " << type(ptr_base) << std::endl;
    std::cout << "Type of pointee: " << type(*ptr_base) << std::endl;
    delete ptr_base;
}
ログイン後にコピー

結論

これらの手法を使用すると、開発者は、マングルされた型名の隠された正体を明らかにし、型名の明確な理解を得ることができます。コードに含まれる型。

以上がC で std::type_info::name をデマングルして基になる型を明らかにするにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート