一、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”表示结束。由于两个相同函数名生成的符号并不相同,所以编译可以通过。