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

前言
先赞后看好习惯 打字不容易,这都是很用心做的,希望得到支持你 大家的点赞和支持对于我来说是一种非常重要的动力 看完之后别忘记关注我哦!️️️
这一篇的内容涉及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 -c和g++ func.c -c来生成test.c和func.c 所对应的汇编文件,test.o和func.o(用gcc编译会报错,因为C不支持重载)

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

此时我们可以清晰的发现,两个名字相同的函数经过修饰之后,名字不同了。
_Z4funcid
_Z4funcii
其中4代表函数名的长度,id代表参数类型的首字母(ii同理)
这就是为什么在链接的时候不会有名字冲突的情况出现。
因为g++编译器也就是C++的编译器,在形成符号表的时候会对函数名进行修饰,而且修饰过后的名字和函数的参数有关!
现在我们换gcc(C的编译器)来尝试一下,看看符号表的函数名,还有没有这种修饰,当然,在此之前我们要调整一下源文件里面的内容,把重载函数去掉,否则会报错。


看到这里,相信大家已经可以清楚的了解到:C++支持函数重载的本质原因,其实就是生成符号表时的函数名修饰规则!
尾声
看到这里,我相信伙伴们对这个问题已经有了比较深入的了解了。
如果这篇博客对你有帮助,一定不要忘了点赞关注和收藏哦!
【C++深度剖析】为什么C++支持函数重载而C不支持--C++程序编译链接过程--符号表生成规则【Linux环境超详细解释C++函数重载底层原理】的更多相关文章
- 转:从编译链接过程解析static函数的用法
关于static函数的用法 就像我们熟知的那样,变量可以分全局的和局部的,函数也可以分全局的和局部的. 比如说,在一个工程的common.h中定义了一个全局变量 int test;那么在整个工程的作用 ...
- libevent源码深度剖析五
libevent源码深度剖析五 ——libevent的核心:事件event 张亮 对事件处理流程有了高层的认识后,本节将详细介绍libevent的核心结构event,以及libevent对event的 ...
- libevent 源码深度剖析十三
libevent 源码深度剖析十三 —— libevent 信号处理注意点 前面讲到了 libevent 实现多线程的方法,然而在多线程的环境中注册信号事件,还是有一些情况需要小心处理,那就是不能在多 ...
- 数据库内核——基于HLC的分布式事务实现深度剖析
DTCC 2019 | 深度解码阿里数据库实现 数据库内核--基于HLC的分布式事务实现深度剖析-阿里云开发者社区 https://developer.aliyun.com/article/70355 ...
- go语言笔记——是c开发的 lex yacc进行词法和语法分析,go不支持函数和运算符重载,不支持类型继承,也不支持断言,还有泛型
从 Go 1.0.3 版本开始,不再使用 8g,8l 之类的指令进行程序的构建,取而代之的是统一的 go build 和 go install 等命令,而这些指令会自动调用相关的编译器或链接器. 如果 ...
- 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的无状态模 ...
- C/C++ Volatile关键词深度剖析(转)
本文转载自博文C/C++ Volatile关键词深度剖析. 背景 前几天,发了一条如下的微博 (关于C/C++ Volatile关键词的使用建议): 此微博,引发了朋友们的大量讨论:赞同者有之:批评者 ...
- c++ 单元测试框架 gmock 深度剖析
c++ 单元测试框架 gmock 深度剖析 随着微服务和CI的流行,在目前的软件工程领域中单元测试可以说是必不可少的一个环节,在TDD中,单元测试更是被提高到了一个新的高度.但是很多公司由于很多不同的 ...
- 读书笔记之:C语言深度剖析
读书笔记之:C语言深度剖析 <C 语言深度解剖>这本书是一本“解开程序员面试笔试的秘密”的好书.作者陈正冲老师提出“以含金量勇敢挑战国内外同类书籍”,确实,这本书中的知识点都是一些在面试中 ...
- libevent学习笔记(参考libevent深度剖析)
最近自学libevent事件驱动库,参考的资料为libevent2.2版本以及张亮提供的<Libevent源码深度剖析>, 参考资料: http://blog.csdn.net/spark ...
随机推荐
- uni-app app定位当前地理位置
https://blog.csdn.net/HXH_csdn/article/details/112258398?utm_medium=distribute.pc_relevant.none-task ...
- 机器学习-线性分类-支持向量机SVM-SMO算法-14
目录 1. SVM算法总结 2. SMO算法 1. SVM算法总结 选择 核函数 以及对应的 超参数 为什么要选择核函数? 升维 将线性问题不可分问题 升维后转化成 线性可分的问题 核函数 有那些? ...
- hello world 的并发实现
本篇文章将介绍 hello world 的并发实现,其中涉及到的知识有: 并发与并行 GPM 调度系统 并发与并行 并发不是并行.并发是同时管理很多事情,这些事情可能只做了一半就被暂停做别的事情了.而 ...
- React报错之ref返回undefined或null
正文从这开始~ 总览 当我们试图在其对应的DOM元素被渲染之前访问其current属性时,React的ref通常会返回undefined或者null.为了解决该问题,可以在useEffect钩子中访问 ...
- [转帖]MySQL联合索引(复合索引)
Mysql联合唯一索引添加相同数据插入报错 联合索引在两个字段都存在唯一,将报错. 1.添加联合索引 alter table "表名" add unique index(`字段1` ...
- 【转帖】淫技巧 | 如何查看已连接的wifi密码
主题使用方法:https://github.com/xitu/juejin-markdown-themes theme: juejin highlight: github 一.引言 在实际工作中,常常 ...
- [转帖]linux下 进程io队列,IO队列和IO调度
IO体系概览 先看看本文主题IO调度和IO队列处于整个IO体系的哪个位置,这个IO体系是非常重要的,了解IO体系我们可以对整个IO过程有个全面的认识.虽然一下两下并不清楚IO体系各个部分的细节,但是我 ...
- Docker 安装Oracle12c的镜像修改字符集 并且进行启动的简单过程
学习来自 昨天晚上转帖的文章 这里面添加一些自己的内容 首先获取配置文件 git clone https://github.com/oracle/docker-images.git 获取之后比较容易了 ...
- K8S 知识点
1. K8S集群大小 在 v1.7 版本中,Kubernetes 支持集群节点(node)数可达1000个.更具体地说,我们配置能够支持所有如下条件: 不超过2000个节点 不超过总共6000个 po ...
- [译]深入了解现代web浏览器(二)
本文是根据Mariko Kosaka在谷歌开发者网站上的系列文章https://developer.chrome.com/blog/inside-browser-part2/ 翻译而来,共有四篇,该篇 ...