我们得先知道函数重载是什么?
函数的重载:
在同一个作用域类,一组函数的函数名相同,参数列表不同(个数不同/类型不同),返回值可同可不同。
1.那么问题来了,为什么C语言不支持重载,C++支持重载呢?
我们先来看看,编译的整个过程:
.C语言中为什么不能支持函数重载?
从上图可知编译器在编译.c文件时,只会给函数进行简单的重命名;具体的方法是给函数名之前加上”_”;所以加入两个函数名相同的函数在编译之后的函数名也照样相同;调用者会因为不知道到底调用那个而出错;
2.C++中函数重载底层是如何处理的?
- 在.cpp文件中,虽然两个函数的函数名一样,但是他们在符号表中生成的名称不一样。
- ‘?’表示名称开始,‘?’后边是函数名“@@YA”表示参数表开始,后边的3个字符分别表示返回值类型,两个参数类型。“@Z”表示名称结束。
- 由于在.cpp文件中,两个函数生成的符号表中的名称不一样,所以是可以编译通过的。
3.C++中能否将一个函数按照C的风格来编译?
#include<iostream>
#include<Windows.h>
using namespace std;
extern "C" int Add(int a, int b)
{
return a + b;
}
int main()
{
cout << Add(10, 20) << endl;
system("pause");
return 0;
}
可以按照C风格来编译,只需在函数名前加extern "C" 就可以完成按照C风格来编译