C/C++编程:名称的特殊处理

1060 篇文章 307 订阅
本文探讨了C++中成员变量和函数的名称修饰(name mangling)机制,以及如何确保在成员函数重载时保持唯一性。通过实例展示了编译器如何在派生类中处理同名成员,并解释了参数列表在创建独一无二函数标识中的作用。名称修饰在链接阶段有助于避免命名冲突,确保正确调用。
摘要由CSDN通过智能技术生成

一般来讲,成员的名称前面会加上类的名称,形成独一无二的命名

成员数据

比如:

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,那么任何不正确的调用操作都将在链接时期就因为无法决议而失败。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值