关于inline函数声明和定义为什么不可以分离

简介: 关于inline函数声明和定义为什么不可以分离

个人主页:Lei宝啊

愿所有美好如期而遇


前言

inline函数在使用时声明和定义不可以分离,接下来我们将会解释为什么是这样的。


我们从程序的编译链接说起。

首先我们先介绍一下程序的翻译环境:

编译分以下几个步骤,预处理,编译,汇编,接下来我将会使用Linux来演示。

预处理展开了头文件,去掉了注释,以及宏替换

编译阶段将代码翻译成了汇编指令。

汇编阶段将代码翻译成了二进制指令

以及最后的链接阶段。

上面我们简单了解了一下编译和链接,下面就深入了解一下。

在test.o和可执行程序的代码里,在我们看来都是乱码,没有任何规律,我们也看不懂,但是我们又想知道里面到底汇总了什么,所以我们使用readelf工具来一探究竟。


下面是符号表,可以看到我们代码中的符号汇总在了这个表中,并且没有局部变量。

但是什么是符号?什么是符号汇总?在编译阶段,会进行符号汇总,就是全局上的一些函数,库函数,全局变量等,在汇编阶段,将这些符号的信息编入一个表,就叫做符号表。

值得说明的是函数声明时,函数的符号也会编入符号表,只是没有有效地址,C++规定,写了声明,定义没写或者在其他文件里,然后去调用这个函数,只要参数匹配,暂时不会报错,等到链接的时候,符号表合并,这个时候再找不到函数的有效地址才会报错。

链接阶段,编译器会去符号表中寻找函数的地址,如果找不到就会报错。


了解了这些基本知识后,我们可以介绍inline声明和定义不能分离的原理了。

如果我们inline函数声明与定义分离,像这样:

那么在编译后,inline函数展开,形成的地址不会进入符号表,但是头文件里函数的声明会将Add函数汇总合并到符号表里,因为只是声明,没有有效地址,当编译器真的根据这个无效地址去找函数的定义时,就报错了。

这就是为什么inline函数声明和定义不可以分离。

目录
相关文章
|
存储 算法 编译器
【C++ TypeName用法 】掌握C++中的TypeName:模板编程的瑞士军刀
【C++ TypeName用法 】掌握C++中的TypeName:模板编程的瑞士军刀
848 1
|
前端开发 开发工具 Android开发
Android播放器之SurfaceView与GLSurfaceView
Surface的官方介绍:Handle onto a raw buffer that is being managed by the screen compositor,Surface是一个raw buffer的句柄,通过它在raw buffer上进行绘制,可以通过Surface获得一个Canvas。
407 0
|
存储 数据库 数据库管理
SQLite中的B-Tree实现细节分析
SQLite在存储在外部的数据库是以B-Tree来组织的。
285 8
|
消息中间件 算法 编译器
【FreeRTOS(一)】FreeRTOS新手入门——初识FreeRTOS
【FreeRTOS(一)】FreeRTOS新手入门——初识FreeRTOS
|
JavaScript Java 测试技术
基于springboot+vue.js的企业资产管理系统附带文章和源代码设计说明文档ppt
基于springboot+vue.js的企业资产管理系统附带文章和源代码设计说明文档ppt
222 8
|
算法 数据挖掘 BI
❤️ Python 利用NetworkX绘制精美网络图 ❤️
NetworkX 是一个用 Python 语言开发的图论与复杂网络建模工具,内置了常用的图与复杂网络分析算法,可以方便的进行复杂网络数据分析、仿真建模等工作。networkx支持创建简单无向图、有向图和多重图;内置许多标准的图论算法,节点可为任意数据;支持任意的边值维度,功能丰富。主要用于创造、操作复杂网络,以及学习复杂网络的结构、动力学及其功能。用于分析网络结构,建立网络模型,设计新的网络算法,绘制网络等等。
2846 0
❤️ Python 利用NetworkX绘制精美网络图 ❤️
|
存储 安全 算法
【C++ 17 包裹类 泛型容器 std::any】深入理解与应用C++ std::any:从泛型编程到多态设计
【C++ 17 包裹类 泛型容器 std::any】深入理解与应用C++ std::any:从泛型编程到多态设计
1596 1
|
数据可视化 数据挖掘 API
Matplotlib控制坐标轴刻度间距和标签
进行作图时需要对坐标轴进行标注,以满足学习或工作的要求,使统计图变得清晰简洁。借助Matplotlib库,可以方便的对进行数据分析,快速完成数据可视化。
4815 0
Matplotlib控制坐标轴刻度间距和标签
|
存储 算法 数据管理
【C++入门到精通】C++入门 ——搜索二叉树(二叉树进阶)
在C++中,本文介绍了搜索二叉树(二叉搜索树,BST)的概念和基本操作,包括搜索、插入和删除。搜索操作从根节点开始,按值大小决定左右查找;插入操作找到合适位置新建节点;删除操作需考虑无子节点、单子节点和双子节点的情况。文中还提供了非递归和递归实现的C++代码示例。此外,讨论了搜索二叉树在K模型和KV模型中的应用以及性能分析,强调了保持树平衡的重要性。
210 0