为什么C++支持函数重载?
1、首先,我们需要了解的是,在c中,要求在同一个作用域中,函数名唯一。就是不允许函数同名。
而在C++中,要求同一个作用域中函数签名唯一。函数签名是函数名+参数列表。就是说允许函数名相同但参数列表不同的函数存在。可见,函数重载跟返回类型没什么关系。
2、那么为什么C++允许函数签名唯一呢?
代码段在被编译器编译的时候,会根据函数名生成函数的调用地址。
C编译器编译之后,函数名不变。
而C++编译器编译之后,函数名就会发生命名置换。比如说代码中的函数是
int function(int a,int b,double c)
{
cout<<a<<b<<c<<endl;
}
gcc编译,命名置换后,会变成_Z8functioniid。
其中_Z是gcc编译器的保留字,不同的编译器,生成的保留字也会不一样,8是函数名的字符数量,iid则是参数列表的缩写。
经过这样一个操作时候,即使是函数名相同,但只要参数列表不同,那么编译之后生成的函数名实际上是不同的。
3、需要注意的是,函数名会发生命名置换,同样,函数调用时也会发生置换。比如说:
int main()
{
function(2,5,2.36);
}
这时,如果在C++中发生调用,不会出现问题。可是,如果是在C中调用,那么C的编译器是找不到经过C++编译器命名置换的函数地址的。因为C编译器没有命名置换,他调用的还是function这个函数名。于是出现了extern "C"这个关键字是告诉C++编译器不用命名替换,用C编译器的方式去编译。
extern "C"
{
int function(int a,int b,double c)
{
cout<<a<<b<<c<<endl;
}
int main()
{
function(2,5,2.36);
}
};
这样就不会出现问题了。