ホームページ >バックエンド開発 >C++ >`std::type_info` からマングルされた C 型名をデマングルするにはどうすればよいですか?

`std::type_info` からマングルされた C 型名をデマングルするにはどうすればよいですか?

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2024-12-27 20:25:10240ブラウズ

How Can I Demangle Mangled C   Type Names from `std::type_info`?

std::type_info からの謎めいた名前の解読

C の領域では、 std::type_info は、クラスによって例示されるエンティティの型についての重要な洞察を提供します。インスタンスまたは関数。ただし、この型名の表現が混乱しているため、その本当の正体がわかりにくくなることがよくあります。たとえば、typeid(std::vector).name() は「St6vectorIiSaIiEE」を生成し、明敏な頭脳か難解なアルゴリズムによってのみ解読可能とします。

謎の解明

飼いならすにはこのバラバラになった獣に対して、私たちは恐るべき分解能力を活用したソリューションを提案します。 std::demangle の、基になる型の人が読める形式を明らかにするための強力なツールです。このソリューションを使用するためのステップバイステップのガイドは次のとおりです:

  1. type.hpp: 次の宣言を使用して基礎となるヘッダー ファイルを確立します:
#include <string>
#include <typeinfo>

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

template <class T>
std::string type(const T& t) {
    return demangle(typeid(t).name());
}
  1. type.cpp (C 11): C 11 の機能を利用して効率的なデマングリング操作を行う:

    #ifdef __GNUG__
    #include <cstdlib>
    #include <memory>
    #include <cxxabi.h>
    
    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 ;
    }
    
    #else
    std::string demangle(const char* name) {
    return name;
    }
    #endif
  2. type.cpp (C 98): システムに代替ソリューションを提供するC11なし機能:

    #ifdef __GNUG__
    #include <cstdlib>
    #include <memory>
    #include <cxxabi.h>
    
    struct handle {
    char* p;
    handle(char* ptr) : p(ptr) { }
    ~handle() { std::free(p); }
    };
    
    std::string demangle(const char* name) {
    
    int status = -4; // some arbitrary value to eliminate the compiler warning
    
    handle result( abi::__cxa_demangle(name, NULL, NULL, &status) );
    
    return (status==0) ? result.p : name ;
    }
    
    #else
    
    // does nothing if not g++
    std::string demangle(const char* name) {
    return name;
    }
    
    #endif
  3. 使用法: ソリューションをコードに統合して、人間が読める型名を簡単に抽出します:

    #include <iostream>
    #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;
    }

このアプローチを利用すると、次の出力は次のようになります。 generated:

Type of ptr_base: Base*
Type of pointee: Derived

互換性と注意点:
提供されたソリューションは、 g 、clang 、Mingw32 などのさまざまなプラットフォームとコンパイラーでテストされています。主に g をターゲットとしていますが、C 98 バージョンは非 g システムでも使用できます。ベンダー固有の API はそれに応じて異なる場合があることに注意することが重要です。

結論として、このデマングリング ソリューションを使用すると、人間が判読できる型名を std::type_info から簡単に抽出できるようになり、マングルされた表現に伴う不明瞭さが排除されます。提供されたコード スニペットを活用することで、この機能をプロジェクトにシームレスに統合し、デバッグ機能とロギング機能を明確かつ簡単に強化できます。

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

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