c++ Name-mangling

用C++flit 名字

        Name-mangling是指为了在目标文件符号表中和连接过程中使用的名字通常和编译目标文件的源程序中的名字不一样,编译器将目标源文件中的名字进行调整。Name-mangling不是一个非常新的技术,例如在C语言中也有,我们在汇编C语言时经常看到的以下划线“_”开头的函数名,其实就是C编译器将函数名进行了Name-mangling。 但是在C++中Name-mangling要复杂的多。因为C++中支持overload和override,这就导致了C++编译器必须要有完成的Name-mangling把函数名或者变量名进行调整。 一种Name-mangling的方法(选自Linkerandloader):在C++类外的数据变量的名字完全不进行调整。一个叫做foo的数组的名字调整后还是foo。没有与类相关的函数名字的调整是根据参数类型用__F后缀和一串代表参数类型的字母进行的。 参数类型一般会被进行简写(如void→v,int→i,float→f,char→c,double→d,varages→e,long→l,unsigned→U,const→C,volatile→V,pointer→P,reference→R,function→f,pointertonthmembers→MnS等等)。举例,一个函数是func(float,int,unsignedchar)可能变成func__FfiUc。

类的名字被认为是有类型的,被编码成类的名字的长度后面跟着名字,如4Pair。类还可以含有多个层次的内部类的名字;这些”合法的”名字用Q来编码,后面是一个数字标明层次的数目,然后是类的名字,这样First::Second::Third变成了Q35First6Second5Third。也就是说一个有两个类参数的函数f(Pair,First::Second::Third)变成了f__F4PairQ35First6Second5Third。 类成员函数编码成函数名字,然后是两个下划线,然后是编码后的类的名字,然后是F和参数,这样,cl::fn(void)变成fn__2clFv。所有的操作符也都编码成4或5个字符的名字,如__ml代表*,而__aor代表

你可能感兴趣的:(C++/log4cplus)