引子:为什么c++支持重载函数而c不支持?
复习,知识回顾:编译环境!
编译环境是将C语言代码转化成二进制指令!不同软件的编译环境都是不同的!
编译环境分为:编译与链接!然后生出.exe的可执行文件!
而编译分为预编译,编译,汇编!
首先,预编译是搞什么什么的呢?
预编译:预编译是做些代码文本的替换工作
体现:gcc text.c-e-o或text.i
包括:1,处理以# 开头的指令 , 比如拷贝 #include 包含的文件代码,#define 宏定义的替换 , 条件编译等,就是为编译做的预备工作的阶段。2,注释的删除,进行文本操作!
补充:条件编译:#if #elif #else #endif
AS:判断是否被定义:
1,#if define(max)
2,#if def Max
3,#if !defined(max)
4,#ifdef Max
5,#progma once
预处理的类型:
1,预定符号,_ _FIEL_ _路径,_ _DATE_ _日期,_ _TIME_ _时间 _ _LINE_ _行号
2,#define定义,#define name stuff;#define CASE break;case等,大家可以自己个性化来书写!
3,define宏定义,#define(参数列表);
4,对于小型运算比较容易使用宏效率更高!
编译:将c语言中代码成汇编语言,生出text.s文件。
过程有,1词法分析 2,语法分析 3,语义分析 会符号汇总!
汇编:把汇编代码翻译成二进制指令发生形成.o或.obj文件,会形成符号汇总表!
链接:是将各种代码和数据片段收集并组合成为一个单一文件的过程,这个文件可被加载(复制)到内存并执行。
包括:
1:符号解析(sysbol resolution):符合可以是一个函数、一个全局变量或者一个静态变量,在目标文件中有对这个符号进行定义和引用的地方,符号解析的目的就是将每个引用和定义相关联起来。
2:重定位(relocation):编译器和汇编器生成从地址0开始的代码和数据,而当实际运行在内存中时,它们的地址肯定会发生变化。重定位的作用就是将每个符号定义与一个内存位置相关联起来,然后修改所有对这些符号的引用,使得它们指向实际的内存位置。
AS:
关系图如下:![](https://img-blog.csdnimg.cn/direct/269a8097a28c47c4b2b8c3a24066b059.png)
函数重载:
是函数的一种特殊情况,C++允许在同一作用域中声明几个功能类似的同名函数,这 些同名函数的形参列表(参数个数 或 类型 或 类型顺序)不同,常用来处理实现功能类似数据类型 不同的问题。
什么事函数重载?
void Swap(double* pa, double* pb)
{
cout << "void Swap(double* pa, double* pb)" << endl;
}
void Swap(int* px, int* py)
{
cout << "void Swap(int* pa, int* pb)" << endl;
}
如上,就是重载了,在c中是不支持的,在c++支持!
问题解释与c++与c中不同!
我们知道,在链接过程中,是在.h的.c中去找定义的
一个函数名,本质是,找的是函数名的指针地址。函数地址就是第一指令的地址!
那区别就来了!本质是是否有修饰函数名!
我们看以下二张图!
c语言中:
c++语言中:
如上我们很清楚知道了函数重载的本质!
今天就到这里了,关注我,后期更精彩!