相同的作用域,如果两个函数名相同,而参数不同,我们就把他们成为重载
参数不同的形式有以下几种:
(1)参数的个数不同
(2)参数的类型不同
(3)参数的顺序不同
(4)参数的数量和类型不同
但是不能定义让编译器产生二义性的重载。
#include <iostream>
using namespace std;
void fun(int a, int b)
{
cout<<"int fun"<<endl;
}
void fun(double a, double b)
{
cout<<"double fun"<<endl;
}
//int fun(int a,int b) //这是不合法的,很容易理解这会引起二义性
//{
// cout<<"int fun return"<<endl;
// return a;
//}
int fun(int a, double b) //ok
{
cout<<"int double fun"<<endl;
return a;
}
int main()
{
fun(2,3);
fun(2.1,3.1);
fun(1,3.1);
return 0;
}
其实编译器在编译的时候对每个函数名进行了改编(name managling)
extern “C” 禁止进行名字改编
如果我们编写的C++函数能够让C调用的话,在函数前面加上extern “C” ,因为C是不支持函数重载的
extern "C" void fun(int a)
{
cout<<"void fun"<<endl;
}
//exter "C" void fun(double b) //error,这样会有两个fun函数,这是不允许名字改编的
//{
// cout<<"double"<<endl;
//}
//如果同时将很多的函数定义为exter "C"
#ifdef _cplusplus //如果是c++的话加上extern,如果是C的话不用加extern
extern "C"
{
#endif
void fun1();
void fun2();
#ifdef _cplusplus
};
#endif