前言

先赞后看好习惯 打字不容易,这都是很用心做的,希望得到支持你 大家的点赞和支持对于我来说是一种非常重要的动力 看完之后别忘记关注我哦!️️️

这一篇的内容涉及C++程序运行底层,我们需要对C++程序的编译和链接过程要非常熟悉,我们才可以掌握这一篇的内容。在这里,博主先给大家安利一篇程序编译链接的干货文章。这里面的内容对大家的学习是非常有帮助的。

由于这篇文章的内容我们需要用Linux环境来进行演示,因此我们先要熟悉Linux的一些基本操作。


那么这里博主先安利一下一些干货满满的专栏啦!

数据结构专栏:数据结构 这里包含了博主很多的数据结构学习上的总结,每一篇都是超级用心编写的,有兴趣的伙伴们都支持一下吧!
算法专栏:算法 这里可以说是博主的刷题历程,里面总结了一些经典的力扣上的题目,和算法实现的总结,对考试和竞赛都是很有帮助的!
力扣刷题专栏:Leetcode 想要冲击ACM、蓝桥杯或者大学生程序设计竞赛的伙伴,这里面都是博主的刷题记录,希望对你们有帮助!
C的深度解剖专栏:C语言的深度解剖 想要深度学习C语言里面所蕴含的各种智慧,各种功能的底层实现的初学者们,相信这个专栏对你们会有帮助的!


Linux环境g++编译器的配置以及一些准备工作

如果要搞清楚C++支持重载的原因的本质,我们需要使用g++编译器来逐步编译源文件。

  • gcc是C的编译器
  • g++是C++的编译器

在我们安装Linux环境的时候,gcc一般是已经帮我们安装好了的,但是g++需要我们自己配置一下,输入一个指令即可
配置g++指令:yum install gcc-c++ libstdc++-devel
当然,这个指令需要root权限,我们在指令前加个sudo,然后输入密码即可。

现在g++已经安装好了,使用方式和gcc大致相同,还没弄清楚的伙伴可以参考这篇,了解一下怎么逐步编译源文件。

准备工作:
准备三个源文件,func.h func.c test.c(不会弄的先看看博主关于Linux基本指令的文章,先学会在Linux环境下编程)
.h文件里面准备好两个相互重载的函数的声明
func.c文件里面准备好这两个函数的定义
test.c里面准备好函数的调用代码




注意:为什么我们写C++程序,后缀可以用.c,这是因为在Linux系统中,后缀其实不那么重要,辨识文件的其实是iNode,这个博主在往期博客里有讲,在文章开头有传送门。
无论我写成.c还是.cpp,只要我用gcc编译就是C语言,用g++编译就是C++。


源文件的符号表生成以及分析

在这里博主带大家复习一下,一个源文件到一个可执行程序(windows下为.exe,linux下为.out)的过程。


那么为什么C++可以支持函数重载呢?其实就是在汇编过程生成符号表的时候,函数名修饰规则支持的!
现在,我们先把符号表找出来看看!我们看看func.c的符号表,这里涉及很多Linux的操作,博主还是继续提供传送门。

我们输入指令g++ test.c -cg++ func.c -c来生成test.cfunc.c 所对应的汇编文件,test.ofunc.o(用gcc编译会报错,因为C不支持重载)

我们用readelf这个工具查看.o文件的符号表。
-s选项选择查看符号表。(这些博主在传送门的文章里都有讲)

此时我们可以清晰的发现,两个名字相同的函数经过修饰之后,名字不同了。
_Z4funcid
_Z4funcii
其中4代表函数名的长度,id代表参数类型的首字母(ii同理)

这就是为什么在链接的时候不会有名字冲突的情况出现。
因为g++编译器也就是C++的编译器,在形成符号表的时候会对函数名进行修饰,而且修饰过后的名字和函数的参数有关!


现在我们换gcc(C的编译器)来尝试一下,看看符号表的函数名,还有没有这种修饰,当然,在此之前我们要调整一下源文件里面的内容,把重载函数去掉,否则会报错。


看到这里,相信大家已经可以清楚的了解到:C++支持函数重载的本质原因,其实就是生成符号表时的函数名修饰规则


尾声

看到这里,我相信伙伴们对这个问题已经有了比较深入的了解了。
如果这篇博客对你有帮助,一定不要忘了点赞关注和收藏哦!

【C++深度剖析】为什么C++支持函数重载而C不支持--C++程序编译链接过程--符号表生成规则【Linux环境超详细解释C++函数重载底层原理】的更多相关文章

  1. 转:从编译链接过程解析static函数的用法

    关于static函数的用法 就像我们熟知的那样,变量可以分全局的和局部的,函数也可以分全局的和局部的. 比如说,在一个工程的common.h中定义了一个全局变量 int test;那么在整个工程的作用 ...

  2. libevent源码深度剖析五

    libevent源码深度剖析五 ——libevent的核心:事件event 张亮 对事件处理流程有了高层的认识后,本节将详细介绍libevent的核心结构event,以及libevent对event的 ...

  3. libevent 源码深度剖析十三

    libevent 源码深度剖析十三 —— libevent 信号处理注意点 前面讲到了 libevent 实现多线程的方法,然而在多线程的环境中注册信号事件,还是有一些情况需要小心处理,那就是不能在多 ...

  4. 数据库内核——基于HLC的分布式事务实现深度剖析

    DTCC 2019 | 深度解码阿里数据库实现 数据库内核--基于HLC的分布式事务实现深度剖析-阿里云开发者社区 https://developer.aliyun.com/article/70355 ...

  5. go语言笔记——是c开发的 lex yacc进行词法和语法分析,go不支持函数和运算符重载,不支持类型继承,也不支持断言,还有泛型

    从 Go 1.0.3 版本开始,不再使用 8g,8l 之类的指令进行程序的构建,取而代之的是统一的 go build 和 go install 等命令,而这些指令会自动调用相关的编译器或链接器. 如果 ...

  6. ASP.NET MVC深入浅出系列(持续更新) ORM系列之Entity FrameWork详解(持续更新) 第十六节:语法总结(3)(C#6.0和C#7.0新语法) 第三节:深度剖析各类数据结构(Array、List、Queue、Stack)及线程安全问题和yeild关键字 各种通讯连接方式 设计模式篇 第十二节: 总结Quartz.Net几种部署模式(IIS、Exe、服务部署【借

    ASP.NET MVC深入浅出系列(持续更新)   一. ASP.NET体系 从事.Net开发以来,最先接触的Web开发框架是Asp.Net WebForm,该框架高度封装,为了隐藏Http的无状态模 ...

  7. C/C++ Volatile关键词深度剖析(转)

    本文转载自博文C/C++ Volatile关键词深度剖析. 背景 前几天,发了一条如下的微博 (关于C/C++ Volatile关键词的使用建议): 此微博,引发了朋友们的大量讨论:赞同者有之:批评者 ...

  8. c++ 单元测试框架 gmock 深度剖析

    c++ 单元测试框架 gmock 深度剖析 随着微服务和CI的流行,在目前的软件工程领域中单元测试可以说是必不可少的一个环节,在TDD中,单元测试更是被提高到了一个新的高度.但是很多公司由于很多不同的 ...

  9. 读书笔记之:C语言深度剖析

    读书笔记之:C语言深度剖析 <C 语言深度解剖>这本书是一本“解开程序员面试笔试的秘密”的好书.作者陈正冲老师提出“以含金量勇敢挑战国内外同类书籍”,确实,这本书中的知识点都是一些在面试中 ...

  10. libevent学习笔记(参考libevent深度剖析)

    最近自学libevent事件驱动库,参考的资料为libevent2.2版本以及张亮提供的<Libevent源码深度剖析>, 参考资料: http://blog.csdn.net/spark ...

随机推荐

  1. 20级训练赛Round #5

    A - 凯少与素数 签到 & 思维题, 要使每一对数字 \((i,j)\) 的最大公约数都等于 1,简单来说区间相邻的两个数一定 \(gcd(i,j) = 1\) 并且 \((r - l)\) ...

  2. SpringCloud学习 系列五、创建生产者和消费者验证微服务中心 Eureka的作用

    系列导航 SpringCloud学习 系列一. 前言-为什么要学习微服务 SpringCloud学习 系列二. 简介 SpringCloud学习 系列三. 创建一个没有使用springCloud的服务 ...

  3. vue学习笔记 七、方法的定义和使用

    系列导航 vue学习笔记 一.环境搭建 vue学习笔记 二.环境搭建+项目创建 vue学习笔记 三.文件和目录结构 vue学习笔记 四.定义组件(组件基本结构) vue学习笔记 五.创建子组件实例 v ...

  4. 机器学习-线性分类-支持向量机SVM-软间隔-核函数-13

    目录 1. 总结 SVM 2. 软间隔svm 4. 核函数 1. 总结 SVM SVM算法的基础是感知器模型, 感知器模型 与 逻辑回归的不同之处? 逻辑回归 sigmoid(θx) 映射到 0-1之 ...

  5. 17-三态门(TSL)

    三态门(TSL) 普通的逻辑电路只有两个状态,还有一个高阻态. EN是高电平1 A,B,EN之间的关系是与的关系,当EN为1得时候,EN就不起作用了,输入由A,B决定.EN端为高电平,所以二极管D2截 ...

  6. 【Git】用法小记

    解决windows环境下的CRLF与unix环境下的LF问题,windows提交时CRLF=>LF,签出时LF=>CRLF,unix环境保留 git config --global cor ...

  7. Go-选择排序

    // SelectionSort 选择排序 // 思路: // 1. 遍历整个元素集合,将最小值取出追加到一个有序的元组 // 2. 重复遍历剩余元素集合,取出最小值追加到一个有序元组 // 选择排序 ...

  8. [官网]微软服务器TLS的支持情况

    https://learn.microsoft.com/en-us/windows/win32/secauthn/protocols-in-tls-ssl--schannel-ssp-#tls-pro ...

  9. [转帖]Oracle数据库开启NUMA支持

    NUMA简介 NUMA(Non Uniform Memory Access Architecture,非统一内存访问)把一台计算机分成多个节点(node),每个节点内部拥有多个CPU,节点内部使用共有 ...

  10. [转帖]linux查看端口及端口详解

    https://www.cnblogs.com/the-tops/p/6126941.html   今天现场查看了TCP端口的占用情况,如下图   红色部分是IP,现场那边问我是不是我的程序占用了tc ...