跟我学C++高级篇——获取类型名称的番外小插曲

一、获取类型名称

在前面的反射中,可以通过一些技术手段来实现获取类型的名称。这么一个看似简单的功能,其实实现起来并没有想象的那么简单。在一些框架中,包含了类似的功能,而主流的编译器则支持的各有不同。这不是说这种接口有多么难,而各个编译器可能有自己的实际的出发点或者说应用点,所以才没有做到完全与开发者想象的相同。
编译器厂商的不同造成的结果有点类似于世界上的同语种但不同语言的民族一样,明明大家都明白那个意思,但就是呈现出来不一样。

二、库的支持

在前面也提到过,有一种标准库提到的运算符即typeid(type or expression),它包含在头文件中 中。此处不重点讲解这个运算符的应用,只是提醒大家,这个运算符在不同的编译平台上,产生的结果是不尽相同的,这个就比较麻烦了。可以试着在不同的平台编译一下以下的代码:

auto iname = typeid(int).name();

在常见的VC编译器和g++编译器中得到结果是:

//vc

iname :int
//g++
iname:i

包括在Clang中,也和g++一样产生类似的效果。那么有没一种方法,让二者产生一种更接近于人们的普遍认知的结果呢?肯定有。其实也很好理解,这是处理C++编译器的重命名的问题,也就是人们常说的mangle和demangle现象。那么在gcc中提供了:

#ifdef __cplusplus
namespace __cxxabiv1
{
  extern "C"
  {
#endif
  char*  __cxa_demangle(const char* __mangled_name, char* __output_buffer,
		 size_t* __length, int* __status);
#ifdef __cplusplus
  }
} // namespace __cxxabiv1
#endif

虽然它可以得到类似于VC平台的差不多相近的结果,但实际还是有一些细节的差别的。请在下面的例程中认真的体验。

三、例程

可以将例程在VC和gcc中进行对比查看:

class Teacher
{};
int main() {
  auto iname = typeid(int).name();
  std::cout << "iname type name:" << iname << std::endl;

  // struct or class
  iname = typeid(Teacher).name();
  std::cout << "iname type name:" << iname << std::endl;

  //VC下运行需要注释掉
  iname = abi::__cxa_demangle(typeid(Teacher).name(), nullptr, nullptr, nullptr);
  std::cout << "iname type name:" << iname << std::endl;

  // array
  Teacher t[10];
  iname = typeid(t).name();
  std::cout << "iname type name:" << iname << std::endl;

  iname = abi::__cxa_demangle(typeid(t).name(), nullptr, nullptr, nullptr);
  std::cout << "iname type name:" << iname << std::endl;

  // cv
  Teacher ct;
  const Teacher &act = ct;
  iname = typeid(act).name();
  std::cout << "iname type name:" << iname << std::endl;

  iname = abi::__cxa_demangle(typeid(act).name(), nullptr, nullptr, nullptr);
  std::cout << "iname type name:" << iname << std::endl;

  return 0;
}

运行结果:

//gnuc
iname type name:i
iname type name:7Teacher
iname type name:Teacher
iname type name:A10_7Teacher
iname type name:Teacher [10]
iname type name:7Teacher
iname type name:Teacher

//vc-处理相关的函数后
iname type name:int
iname type name:class Teacher
iname type name:class Teacher
iname type name:class Teacher [10]
iname type name:class Teacher [10]
iname type name:class Teacher
iname type name:class Teacher

在typeid的说明中,已经说明了,其已经自动去除了cv限定符,所以如果需要得到类型包含这个限定符,就有问题了。基础的应用就是基础的应用,不能强求太多的要求。有的时候儿在一些开源库中看到大堆的模板和宏处理这类问题,就知道,解决这个不起眼的小功能,可能就需要很多工作量和代码。

四、总结

其实今天分析的这个现象,再次验证了标准是标准,实现是实现这个道理。标准指挥着实现,但实现不一定必须严格按标准来。有些标准未要求到的或者说对实现手段和结果没有要求的,这都是编译器厂商可以自行决定的。包括在实现标准后再在其基础上进行扩展支持的,这都不少见。
标准是方向和目标,编译厂商是行动者和实践者,达到目的不一定非得走一条路。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/558380.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【系统分析师】系统配置与性能评价

文章目录 1、性能指标2、阿姆达尔解决方案3、性能评价方法 1、性能指标 例题 2、阿姆达尔解决方案 大概了解 例题 3、性能评价方法

122.Mit.S081操作系统内核(实验环境搭建)

目录 一、前言 二、实验官网 三、可参考内容 四、qemu介绍 五、环境搭建 1.Linux系统 ubuntu 脚本安装 检测是否安装成功 2.SSH连接工具 3.获取代码 六、搭建成功实例 1.源码目录简析 2.启动xv6 3.远程连接成功示例 一、前言 Mit6.s081 是麻省理工学院面向本…

Antd:在文本框中展示格式化JSON

要想将对象转换为格式化 JSON 展示在文本框中&#xff0c;需要用到 JSON.stringify JSON.stringify 方法接受三个参数&#xff1a; value&#xff1a;必需&#xff0c;一个 JavaScript 值&#xff08;通常为对象或数组&#xff09;要转换为 JSON 字符串。replacer&#xff1a…

商务品牌解决方案企业网站模板 Bootstrap5

目录 一.前言 二.展示 三.下载链接 一.前言 这个网站包含以下内容&#xff1a; 导航栏&#xff1a;主页&#xff08;Home&#xff09;、关于&#xff08;About&#xff09;、服务&#xff08;Services&#xff09;、博客&#xff08;Blog&#xff09;等页面链接。主页部分…

Adipogen—Progranulin (human) ELISA Kit (mAb/mAb)

前颗粒蛋白&#xff08;Progranulin&#xff0c;PGRN&#xff09;是一种富含半胱氨酸的蛋白质&#xff0c;由~ 6kDa大小的颗粒蛋白&#xff08;granulin&#xff0c;GRN&#xff09;组成&#xff0c;具有多功能生物活性&#xff0c;在癌症、炎症、代谢性疾病和神经退行性疾病中…

2024洗地机名牌排行榜:细数最值得买的4大热门款

随着科技的迅速发展&#xff0c;人们的家里纷纷都添置了新的清洁工具——洗地机&#xff0c;它集合了吸、拖、洗于一体&#xff0c;减轻了很多家庭家务的负担&#xff0c;也成为了很多家庭改善清洁体验的新选择。那么市场上的洗地机品牌琳琅满目&#xff0c;我们要如何挑选一款…

教你三招,玩转AI通用大模型ChatGPT

工欲善其事必先利其器&#xff0c;想要高效的用好ChatGPT&#xff0c;首先&#xff0c;让我们从如何与它进行有效的对话开始。要知道&#xff0c;ChatGPT并非简单的问答机器&#xff0c;而是一个可以通过交互学习和适应的智能体。那么&#xff0c;如何让ChatGPT来更好地理解我们…

ruoyi创建子模块

点击项目 -> new -> Module 选择maven模式 构建完成 子项目默认会加入到父项目maven控制在 父项目 pom文件中 dependencyManagement 标签内加入一下代码 新建子模块的名称<!-- 测试--><dependency><groupId>com.safety</groupId><artifact…

vscode+vue开发常用插件整理

前言&#xff1a; vscode新机开发常用插件整理 1、chinese 简体中文配置 2、file-jump 别名跳转&#xff0c;可以把引入的组件&#xff0c;通过ctrl地址名 跳转组件内部 3、Vue Peek&#xff1a;vue项目中的一些配置&#xff0c;安装后&#xff0c;能实现 ctrl组件名 跳转…

JavaEE进阶:基础知识

JavaEE&#xff1a;Java企业开发 Web网站的工作流程 ⽬前用户对PC端应⽤的开发结构模式主要分为C/S和B/S结构. CS即Client/Server&#xff08;客户机/服务器&#xff09;结构. 常⻅的C/S架构的应⽤⽐如QQ&#xff0c;CCTALK&#xff0c;各种⽹络游戏 等等&#xff0c;⼀般需…

【创建型模式】工厂方法模式

一、简单工厂模式 1.1 简单工厂模式概述 简单工厂模式又叫做静态工厂方法模式。 目的&#xff1a;定义一个用于创建对象的接口。实质&#xff1a;由一个工厂类根据传入的参数&#xff0c;动态决定应该创建哪一个产品类(这些产品类继承自一个父类或接口)的实例。 简单工厂模式…

MYSQL之增删改查(上)

前言&#xff1a; 以下是MySQL最基本的增删改查语句&#xff0c;很多IT工作者都必须要会的命令&#xff0c;也 是IT行业面试最常考的知识点&#xff0c;由于是入门级基础命令&#xff0c;所有所有操作都建立在单表 上&#xff0c;未涉及多表操作。 1、“增”——添加数据 1.1…

【简单介绍下R-Tree】

&#x1f308;个人主页: 程序员不想敲代码啊 &#x1f3c6;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家 &#x1f44d;点赞⭐评论⭐收藏 &#x1f91d;希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff0c;让我们共…

228 基于matlab的神经网络人脸识别

基于matlab的神经网络人脸识别。 人脸识别以视网膜、 虹膜、 指纹等生物特征的识别作为生物标识符。生物特征识别不很容易伪造、 放错位置。新型脸识别使用的方法 RobustPCA 和径向基函数网络。程序已调通&#xff0c;可直接运行。 228 人脸识别 生物特征识 神经网络 - 小红书 …

【NTN 卫星通信】NTN的信关站应该建在哪些地方

1 概述 3GPP的卫星通信讨论了透传星和再生星两种方式。透传星方式&#xff0c;卫星主要是做为中继存在&#xff0c;基本上不做通信协议的处理。再生星方式&#xff0c;gNodeB的主要功能在卫星上&#xff0c;完成通信协议的主要内容。无论是透传星还是再生星&#xff0c;都需要通…

校园小情书微信小程序源码/社区小程序前后端开源/校园表白墙交友小程序

校园小情书前端代码&#xff0c;好玩的表白墙、树洞、校园论坛&#xff0c;可独立部署&#xff0c;也可以使用我部署的后台服务&#xff0c;毕业设计的好项目。 搭建教程&#xff1a; 一、注册管理后台 1、登录小情书站点进行注册&#xff1a;https://你的域名 2、注册成功…

【JavaEE多线程】线程中断 interrupt()

系列文章目录 &#x1f308;座右铭&#x1f308;&#xff1a;人的一生这么长、你凭什么用短短的几年去衡量自己的一生&#xff01; &#x1f495;个人主页:清灵白羽 漾情天殇_计算机底层原理,深度解析C,自顶向下看Java-CSDN博客 ❤️相关文章❤️&#xff1a;清灵白羽 漾情天…

动态酷黑主页源码

效果图 PC端 &#xff08;移动端不能访问&#xff09; 部分代码 index.html <!DOCTYPE html> <html lang"zh-CN"> <head> <meta http-equiv"X-UA-Compatible" content"IEedge,chrome1"> <meta charset"ut…

java算法day58 | 单调栈part01 ● 739. 每日温度 ● 496.下一个更大元素 I

739. 每日温度 思路&#xff1a; 这道题用暴力求解法会超时。 那我们就要想如何只遍历一遍就能求解出每个位置的下一个更大值在哪呢。 主要的思想就是空间换时间。定义一个单调栈&#xff0c;每次遇到比栈顶元素小的或相等的&#xff0c;直接入栈&#xff0c;遇到比栈顶元素大的…

电学启蒙积木电子方案

东莞市酷得智能科技有限公司是一家集芯片贸易和电子方案定制开发的研发型公司&#xff0c;其中电子积木方案是酷得经营多年的其中一条比较成熟的研发线。电学积木玩具不仅仅是一种娱乐工具&#xff0c;更是一种教育工具&#xff0c;能够在孩子们的成长过程中发挥多方面的积极作…
最新文章