C++类名demangle

2023-05-16

RTTI与type_info

C++在编译时开启RTTI(Run-Time Type Identification,通过运行时类型识别)特性时,可以在代码中使用typeid操作符(当然还需要包含<typeinfo>),此符号可以对一个变量或者一个类名使用,返回一个type_info对象的引用。编译时会为每种使用到RTTI的特性的C++类都建立一个唯一的type_info对象,并且会包含继承关系,dynamic_cast便是根据这个对象来判断某个基类对象的指针能否向下转换成子类对象的指针。下面为一个使用typeid的例子:

#include <iostream>                                                                                                                                       #include <string>
#include <typeinfo>
using namespace std;
int main()
{
    string s;
    if(typeid(s) == typeid(string))
    {   
        cout<<"same type"<<endl;
    }   
    else
    {   
        cout<<"different type"<<endl;
    }   
    return 0;
}

mangle

但是我们今天关注的不是RTTI,而是关注与通过type_info获取到的名称信息,type_info有一个name()的方法,返回const char*,但是这个name到底是什么在C++规范中没有限定,因此不同编译器返回的结果不同,例如下面的代码:

cout<<typeid(std::string)<<endl;

如果使用vc编译器进行编译,将返回:

class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >

而g++编译执行时返回的却是:

Ss

后者很难理解,因为这是mangle后的符号名,而VC编译器返回的是demangle后的结果。使用C++的类与函数编译成obj文件后,都是使用mangle后的符号名。例如:假如我们编译了某个linux静态库,可以用nm工具查看其内部包含接口的符号(windows下可以使用dumpbin):

nm  libmyfunc.a

其会返回许多mangle后的符号名,它们其实就是我们在库中编写的函数接口。

如何将这类符号名转换为可读的名称呢?其实不同编译器都提供了“解析”函数,我们可以如下编码:

#include <typeinfo>
#include <string>
#ifdef _MSC_VER
#ifndef WIN32_LEAN_AND_MEAN
#define WIN32_LEAN_AND_MEAN
#endif
#ifndef _WIN32_WINNT
#define _WIN32_WINNT 0x0501
#endif
#include <windows.h>
#include <Dbghelp.h>
std::string CxxDemangle(const char* name)
{
    char buffer[1024];
	DWORD length = UnDecorateSymbolName(name, buffer, sizeof(buffer), 0);
    if (length > 0)
        return std::string(buffer, length);
    else
        return name;
}

#pragma comment(lib, "DbgHelp")

#elif defined __GNUC__

#include <cxxabi.h>
std::string CxxDemangle(const char* name)
{
    char buffer[1024] = {0};
    size_t size = sizeof(buffer);
    int status;
	char *ret;
    if (ret = abi::__cxa_demangle(name, buffer, &size, &status))
        return std::string(ret);
    else
        return name;
}
#endif


#include <iostream>
#include <string>
#include <typeinfo>
using namespace std;
int main()
{
	string s;
	if(typeid(s) == typeid(string))
	cout<<typeid(std::string).name()<<endl;
	cout<<CxxDemangle(typeid(std::string).name())<<endl;
	return 0;
}

上面的CxxDemangle函数便可以用来解析符号名。

关于获取stacktrace以及demangle等相关技术可以参看glog、google perftools等相关开源项目的代码。


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++类名demangle 的相关文章

  • MYSQL知识点

    本文根据bilibili达内的大数据课程 xff08 BV1FQ4yR7SM xff09 总结 xff0c 受益匪浅 学习的比较慢 xff0c 学完某块 xff0c 我也会继续上传我的笔记 1 mysql基本概念 xff08 1 xff09
  • 用AI给娃定制绘本 #麻瓜+AI混合工作流试验 9

    这次试着用AI给娃定制一本绘本 xff0c 目的是解决一个问题 娃很喜欢国际象棋 xff0c 但在下棋的时候又很怕输 过程中尽量少人工参与 xff0c 先看半成品 xff0c 再说工作流 这个画风 xff0c 有点像娃喜欢的 工作细胞 主要
  • 逃避可耻但有用——当竞争太激烈时的一个通用解法

    往上游走 xff0c 去服务你的竞争对手 竞争激烈 xff0c 意味着供给太多而需求太少 但我们知道 xff0c 供需是有链条的 xff0c 当供需链条里某个生态位上供给太多 xff0c 即玩家太多 xff0c 也意味着这个生态位的需求也多
  • 尝试寻找一些合作伙伴,产品相关培训咨询服务介绍(2B/支持在线)

    若干年来 xff0c 在线下 xff0c 我提供的服务基本都是走进企业的 xff0c 几乎没开过公开课 xff08 如果行业会议上几十分钟的分享不算的话 xff09 而线上的音视频课 训练营等形式都也做过 xff0c 特别是过去的疫情三年
  • 产品总监可以通过培训提升么 to HR/管理者

    我觉得是不行的 从产品岗位从初级到高级 xff0c 越初级 xff0c 越可以通过学习一些标准化的知识 技能来 打底 xff0c 目的是提升下限 而到了总监级别 xff0c 默认已经知道了基础方法论 领域知识 xff08 不知道的也应该有自
  • 产品设计体会(十六)——Feature List

    这周来点实在的 xff0c 这两天主要在列新产品的Feature List 说一下自己感觉这个玩意应该怎么做 xff0c 其中吸取了叶老大原来的表格还有网上一些相关文章的内容 这个表是用Excel 做的 xff0c 一些简单的技巧 xff0
  • 【原创】产品经理值得看的16个博客

    这些都是我经常看的博客 xff0c 但没有一个产品经理的博客 xff0c xff1a xff09 xff08 注意逻辑 xff1a 我并没有说我经常看的博客里没有产品经理的博客 xff09 我觉得产品经理应该是通才 xff0c 本行功夫自不
  • 长假多图-生活中产品的小细节

    再长的休假也有结束的时候 xff0c 今天第一天上班 假期中跑了一些地方 xff0c 拍了一些照片 xff0c 晚上整理起来 xff0c 发现还是挺职业病的 xff0c 特地拍摄了一些生活中产品的小细节 xff0c 分享给大家 先是在南京
  • 给想转行做产品经理的同学

    已经很长一段时间了 xff0c 不断收到邮件 xff0c 有应届生 技术人员 运营人员等等 xff0c 说因为种种原因 xff08 排名第一的原因居然是看了 某本书 xff0c 囧 xff09 xff0c 发现自己真的很喜欢做产品经理 xf
  • [应用方案] 以NuMaker--PFM--M487 实现OLED屏显示驱动

    OLED屏是一种自发光的显示器件 xff0c 它有多种类型 xff0c 按接口分有I2C接口和SPI接口 xff0c 按色彩分有单色 双色及彩色屏 xff0c 按显示规格分为0 91 0 96寸等 本篇将介绍2种OLED屏的显示驱动 xff
  • LED发光原理以及恒流源驱动

    以前最常见的灯是白炽灯 xff0c 距今已经一百多年 xff0c 现在逐渐退出人类视野 xff0c 白炽灯的发光原理是灯丝通电后产生的热辐射发出光芒 xff0c 小时候用手摸白炽灯泡 xff0c 会很烫很烫 xff0c 因为它的大部分能量以
  • [转]Python图像resize前后颜色不一致问题

    转自 https www cnblogs com nwpuxuezha p 7236155 html 师弟很厉害 xff0c 可以加鸡腿了 以下为原文 xff1a 今天帮师姐解决一个bug xff0c 测试了Python图像resize前后
  • VTK、ITK安装及ITK读取图片、VTK显示示例(CMake)

    VTK ITK安装及ITK读取图片 VTK显示示例 文章目录 前言一 配置二 混合编程实例1 创建工程2 修改CMakeLists txt3 画界面mainwidow ui3 编程 xff08 1 xff09 4 运行 反思总结 前言 本文
  • mysql -u root -p 登录和退出

    一 登录MySQL 语法 mysql h 主机名 u用户名 p密码 P端口号 D数据库名 参数分析 xff1a h主机名或ip地址 或者 host 61 主机名ip地址 xff1a 指定登录的主机名 xff1b u用户名 或者 user 6
  • Oracle_plsql_this is the trial version of pl/sql developeryou've got X day left

    plsql Product Code xff1a ljkfuhjpccxt8xq2re37n97595ldmv9kch span class token keyword Serial span Number xff1a span class
  • Oracle_同义词

    Oracle 同义词 Oracle 同义词 span class token number 1 span Oracle同义词简介 Oracle数据库中提供了同义词管理的功能 同义词是数据库方案对象的一个别名 xff0c 经常用于简化对象访问
  • Oracle_START WITH_CONNECT BY PRIOR

    oracle的start with connect by prior如何使用 oracle中connect by prior的使用
  • java.lang.IllegalArgumentException:No bean specified.

    问题描述 后台到前台渲染控制台报错 ExceptionHandler handle span class token punctuation span span class token punctuation span exception

随机推荐