跟我学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,
		
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值