c++支持重载函数而c不支持,在翻译环境中的解释

5 篇文章 0 订阅
5 篇文章 0 订阅

引子:为什么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:

关系图如下:


 

函数重载:

是函数的一种特殊情况,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++语言中:

如上我们很清楚知道了函数重载的本质!

今天就到这里了,关注我,后期更精彩!

  • 37
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值