函数重载、C/C++符号生成规则

一、C/C++符号生成规则

函数符号:在编译阶段生成的字符串,来指明函数的定义或原型 。

C函数符号生成规则:
_cdel调用约定(C标准调用约定):函数名前加下划线。

_stdcall调用约定:函数名前加下划线,函数名后加“@”符号和其参数字节。

_fastcall调用约定:函数名前加“@”符号,函数名后加“@”字符和其参数字节。

C++函数符号生成规则:
_cdecl调用约定:“?”+函数名+参数表的开始标识 “@@YA” + 函数返回类型代号+参数类型代号 +结束标识“@Z”或“Z”(无参数)。
eg:?Sum@@YAHHH@Z

_stdcall调用约定:“?”+函数名+参数表的开始标识“@@YG”+函数返回类型代号+参数类型代号 +结束标识“@Z”或“Z”(无参数)。

_fastcal调用约定:“?”+函数名+参数表的开始标识 “@@YI”+ 函数返回类型代号+参数类型代号 +结束标识“@Z”或“Z”(无参数)。

thiscall调用约定(类成员方法的约定):“?” +函数名+ “@”字符引导的类名+参数表的开始标识(函数性质决定)+ 函数返回类型代号+参数类型代号 +结束标识“@Z”或“Z”(无参数)。

参数表的开始标识:公有(public)成员函数的标识“@@QAE”,保护(protected)成员函数的标识“@@IAE”,私有(private)成员函数“@@AAE”;如果使用Const ,则对应的标识“@@QBE”,“@@IBE”,“@@ABE”。

二、函数重载

什么是函数重载

函数重载指的是在相同作用域内,可以有一组具有相同函数名、不同参数列表的函数。

  • 函数重载三要素:同名、不同参数、同作用域(同一个类、同一个命名空间等)。
  • 函数返回值可以相同也可以不同,返回值不能作为重载的依据。

为什么需要函数重载
1、避免了为实现同一个功能的函数取很多个名字;
2、类的构造函数跟类名相同,也就是说:构造函数都同名。如果没有函数重载机制,要想实例化不同的对象,就很麻烦了;
3、操作符重载,本质上就是函数重载,它大大丰富了已有操作符的含义,方便使用。

C语言为什么不支持函数重载
编译器在编译.c文件时,只会给函数进行简单的重命名:在函数名之前加上“_”,所以两个函数名相同的函数在编译之后的函数名也相同,以至于调用时不知道具体调用哪一个函数。

C++底层是如何处理函数重载的
在.cpp文件中,虽然两个函数名相同,但是它们在符号表中生成的名字不相同。以“?”开头,再加函数名,“@@YA”表示参数列表开始,后面3个字符分别表示返回值类型,参数类型,“@Z”表示结束。由于两个相同函数名生成的符号并不相同,所以编译可以通过。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值