先来说一下基本概念:
函数重载:
在同一作用域中 声明 功能相似的多个同名函数,条件是这些同名函数的形参列表不一致(函数参数个数,类型,顺序)
函数名修饰规则:
编译器编译代码时赋予函数的新名称,和函数的名称以及形参列表有关,是实现函数重载的关键
为什么C++支持重载,而C语言不行:
关键就在于C++有函数名修饰规则,而C语言没有,下面详细说这个函数名修饰规则是怎样支持函数重载的。(需要一些有关C/C++程序运行相关前置知识)
1.C/C++ 的源代码到可执行文件,需要经过预处理,编译,汇编,链接四个阶段;
2.当当前程序的执行流程调用某个函数时,它会根据调用位置处留下的函数地址跳转到函数位置去执行(函数的实现可能在不同的文件)
3.在链接执行之前,函数调用处是没有函数地址的
4.在汇编阶段,编译器会生成符号表记录函数名称和函数地址(函数名修饰规则就在这个阶段起作用)
5.若无函数名修饰规则,那么编译器只根据原始函数名来生成放在符号表中的函数名;如果有修饰规则,那么会将形参个数,类型,顺序也添加进考虑范围,以形成新的函数名
6.回到链接阶段,链接器将为每个函数调用处匹配相应的函数地址,通过查看符号表来匹配
所以我们可以得出,能否为有相同原始名称的函数生成不同名的函数名,就是在链接阶段找到对应函数的关键,也就决定了能否实现重载。
下面看两张图,分别是C,C++生成函数名的规则
C语言编译器的结果
C++编译器的结果: