首页 > 后端开发 > C++ > 如何分解 std::type_info::name 以揭示 C 中的基础类型?

如何分解 std::type_info::name 以揭示 C 中的基础类型?

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 的 De-Mangler:揭开神秘名称

被 std::type_info 破坏的名称仍然是个谜,使得理解底层类型变得困难。为了寻求解开这个谜团的解决方案,人们探索了各种方法。

解开混乱的名称

一个解决方案利用了 C 11 的强大功能和 g '通过 abi::__cxa_demangle 函数打开 libstdc 库。此函数对损坏的名称进行解码,返回人类可读的字符串。

C 11 实现

在 C 11 实现中,demangle 函数包含在“类型.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;
}
登录后复制

结论

通过这些技术,开发人员现在可以揭开损坏类型名称的隐藏身份,从而更清楚地了解代码中涉及的类型。

以上是如何分解 std::type_info::name 以揭示 C 中的基础类型?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板