先来看一段代码
#include <stdio.h>
int Add(int a,int b)
{
return a+b;
}
double Add(double a,double b)
{
return a+b;
}
int main()
{
return 0;
}
在c语言编译器下是错误的,根本编译不过去,编译器会报出Add重定义的错误。
函数重载:为方便使用,c++中对函数可以进行重载。也就是说,在同一作用域类,一组函数的函数名可以相同,参数列表可不同(参数个数不同,参数类型不同),返回类型可同可不同。
不如下面的代码:
#include <iostream>
using namespace std;
int Add(int a,int b,int c)
{
return a+b+c;
}
int Add(int a,int b)
{
return a+b;
}
double Add(double a,double b)
{
return a+b;
}
double Add(int a,double b)
{
return a+b;
}
int main()
{
cout<<Add(1,2)<<endl;
cout<<Add(2,2,3)<<endl;
cout<<Add(3.14,2.25)<<endl;
cout<<Add(1,2.23)<<endl;
return 0;
}
在c++编译器中是可以编译过的,而且不会报出错误。
因为在c++的编译过程中对函数名的解析不同。
c++程序中调用c编译器编译后的函数为什么要加extern "C"?
答:C++语言支持函数重载,C语言不支持函数重载。函数被C++编译后在库中的名字与C语言不同,例如 int Add(int x,int y); 在被C编译器编译后为_Add,而C++则会产生像?Add@@YAHHH@Z之类的名字,所以C++提供了C连接交换指定符号extern “C”来解决名字匹配问题。