引入
c++ 相比c有一个新特性就是overload 又名函数重载,是c++静态多态或者编译多态的实现
但是c不行,
c 语言中的函数名处理
c程序在汇编过程中,编译器会收集全局符号并生成全局符号表
符号表即,讲符合与其地址一一对应的表哥称为符号表,
在汇编的过程中我们生成了多个符号表,但最后我们只能有一个符号表,所以在链接过程中要对符号表进行合并。在合并的过程中发现同一个函数出现了两次
C++的名字修饰(name mangling/name decoration)
C++如何支持函数重载呢?
编译器会根据函数名和参数类型生成修饰后的函数名,每个重载函数都具有唯一的修饰名称。例如:
例如:
int add(int a, int b){return a+b;}
double add(double a, double b){return a + b;}
编译后成为(反汇编可以看到):
00000000000008da <_Z3addii>:
00000000000008ee <_Z3adddd>:
这里 _Z 表示函数名被修饰,后面跟原名称和参数类型编码。所以每个函数都获得了唯一标识,重载实现了。
extern “C”的情况
值得注意的是,当C++代码被放在extern “C”块内时,编译器会确保函数名不被修饰,保持与C语言兼容
参考文档
https://en.wikipedia.org/wiki/Name_mangling