为什么C++支持重载而C不支持—函数名修饰规则

119 阅读2分钟

先来说一下基本概念:

函数重载:

在同一作用域中 声明 功能相似的多个同名函数,条件是这些同名函数的形参列表不一致(函数参数个数,类型,顺序)

 

函数名修饰规则:

编译器编译代码时赋予函数的新名称,和函数的名称以及形参列表有关,是实现函数重载的关键

 

 

为什么C++支持重载,而C语言不行:

关键就在于C++有函数名修饰规则,而C语言没有,下面详细说这个函数名修饰规则是怎样支持函数重载的。(需要一些有关C/C++程序运行相关前置知识)

1.C/C++ 的源代码到可执行文件,需要经过预处理,编译,汇编,链接四个阶段;

2.当当前程序的执行流程调用某个函数时,它会根据调用位置处留下的函数地址跳转到函数位置去执行(函数的实现可能在不同的文件)

3.在链接执行之前,函数调用处是没有函数地址的

4.在汇编阶段,编译器会生成符号表记录函数名称和函数地址(函数名修饰规则就在这个阶段起作用)

5.若无函数名修饰规则,那么编译器只根据原始函数名来生成放在符号表中的函数名;如果有修饰规则,那么会将形参个数,类型,顺序也添加进考虑范围,以形成新的函数名

6.回到链接阶段,链接器将为每个函数调用处匹配相应的函数地址,通过查看符号表来匹配

所以我们可以得出,能否为有相同原始名称的函数生成不同名的函数名,就是在链接阶段找到对应函数的关键,也就决定了能否实现重载。

下面看两张图,分别是C,C++生成函数名的规则

C语言编译器的结果

image.png  

C++编译器的结果:

image.png