一般来讲,成员的名称前面会加上类的名称,形成独一无二的命名
成员数据
比如:
class Bar {
public:
int ival;
};
其中的ival
可能会变成ival_3Bar
为什么编译器要这样做? 我们来看个例子:
class Foo : public Bar{
public:
int ival;
};
此时,Foo将转换为:
class Foo{
public:
int ival_3Bar;
int ival_3Foo;
};
不管你要处理哪一个ival,通过name mangling
,都可以清楚的指出来。
成员函数
由于成员函数可以被重载,所以需要更广泛的mangling手法,以提高绝对独一无二的名称。
如果把:
class Point{
public:
void x(float newX);
float x();
};
转换为:
class Point{
public:
void x__5Point(float newX);
float x__5Point();
};
会导致两个被重载的函数实体拥有相同的名称。为了让它们独一无二,必须在加上它们的参数链表(从函数原型中得到)。如果把参数类型也编码进入,就一定可以得到一个独一无二的名称(但如果声明extern "X"
,就会压抑非成员函数的mangling
效果):
class Point{
public:
void x__5PointFf(float newX);
float x__5PointFv();
};
当然,各个编译器都由自己的manling方法,目前没有统一的工业标准。
两个实体如果拥有独一无二的name mangling,那么任何不正确的调用操作都将在链接时期就因为无法决议而失败。