GNU typeid.name()输出符号解析

C/C++ 2015年01月15日 ,

在C++中,typeid是一个运算符,也是C++的关键字,被用来一个对象运行时的类型。它能够确定基类指针运行时指向的派生类型。由于本文主要讲解GNU下的typeid.name()输出符号代表的实际含义,本文不过多的介绍RTTI(Run-Time Type Identification,运行时类型识别),枫竹梦会专门写相关的文章来进行介绍。

typeid.name()输出

既然typeid.name()是输出对象的运行时类型,为什么还需要解释呢?因为标准中只是要求其输出为C-style字符串来标识类型,其输出字符串往往与实际使用的类型名并不一致,并且这还与编译器相关。

举个例子,使用gcc version 4.4.7进行测试:

// typeid output symbol testing
// By furzoom @ Jan.14, 2015
// From http://furzoom.com/
#include
#include  // for typeid
#include  // for string

using namespace std;

class Base {};

class Derived:public Base {};

void f()
{
 Base base, *pBase = NULL;
 Derived derived;

 cout << "unsigned int:" << typeid(unsigned int).name()
 << "\nfloat:" << typeid(float).name()
 << "\nstring:" << typeid(string).name()
 << "\nbase:" << typeid(base).name()
 << "\nBase:" << typeid(Base).name()
 << "\npBase:" << typeid(pBase).name()
 << "\nderived:" << typeid(derived).name()
 << "\nDerived:" << typeid(Derived).name()
 << endl;
}

int main(int argc, char *argv[])
{
 f();
 return 0;
}

其输出如下:

初看起来有点规律但还是找不到规律。

typeid.name()输出符号解析

其输出格式为:[指针][命名空间][类型][模板]

指针:则输出为P

命名空间:空间std输出St,自定义空间则输出空间名称的字符数及它的名子,并以N开头,以E结尾。

类型:自定义类型则输出类型字符数及其名子,若为内置类型,则按下表输出。

模板:类型模板以l开头,以E结尾;常数模板以L开头,以E结尾。

根据GNU的官方文档,内置类型的解释如下:

内置类型 符号
bool b
char c
signed char a
unsigned char h
short s
unsigned short t
int i
unsigned j
long l
unsigned long m
long long x
unsigned long long y
float f
double d
long double e

实例

看着上面的解释,实在繁琐,枫竹梦给出几例子来帮助理解。

FOO:输出3FOO
fur*:输出P3fur
std::complex<long double>:输出St7complexleE
furzoom::com:输出N7furzoom3comE

使用Linux命令进行解析

更复杂的情况就不太适合来分析了。下面给出方便程序员查看的方式。

c++filt -t type

使用你要查询的输出替换上面命令中的type即可。如,

c++filt -t Ss

输出:

std::basic_string<char, std::char_traite<char>, std::allocator<char> >

如无特别说明,本站文章皆为原创,若要转载,务必请注明以下原文信息:
日志标题:《GNU typeid.name()输出符号解析》
日志链接:http://furzoom.com/typeid-name-output-symbols/
博客名称:枫竹梦

发表评论

插入图片

NOTICE1:请申请gravatar头像,没有头像的评论可能不会被回复!

回到顶部