网迎客 网站建设,网页界面设计中主要包括哪三个方面,中企动力网站优化,大型网站开发个人主页#xff1a;Lei宝啊
愿所有美好如期而遇 前言
inline函数在使用时声明和定义不可以分离#xff0c;接下来我们将会解释为什么是这样的。 我们从程序的编译链接说起。
首先我们先介绍一下程序的翻译环境#xff1a; 编译分以下几个步骤#xff0c;预处理#x… 个人主页Lei宝啊
愿所有美好如期而遇 前言
inline函数在使用时声明和定义不可以分离接下来我们将会解释为什么是这样的。 我们从程序的编译链接说起。
首先我们先介绍一下程序的翻译环境 编译分以下几个步骤预处理编译汇编接下来我将会使用Linux来演示。 预处理展开了头文件去掉了注释以及宏替换 。
编译阶段将代码翻译成了汇编指令。 汇编阶段将代码翻译成了二进制指令 以及最后的链接阶段。 上面我们简单了解了一下编译和链接下面就深入了解一下。
在test.o和可执行程序的代码里在我们看来都是乱码没有任何规律我们也看不懂但是我们又想知道里面到底汇总了什么所以我们使用readelf工具来一探究竟。 下面是符号表可以看到我们代码中的符号汇总在了这个表中并且没有局部变量。
但是什么是符号什么是符号汇总在编译阶段会进行符号汇总就是全局上的一些函数库函数全局变量等在汇编阶段将这些符号的信息编入一个表就叫做符号表。
值得说明的是函数声明时函数的符号也会编入符号表只是没有有效地址C规定写了声明定义没写或者在其他文件里然后去调用这个函数只要参数匹配暂时不会报错等到链接的时候符号表合并这个时候再找不到函数的有效地址才会报错。 链接阶段编译器会去符号表中寻找函数的地址如果找不到就会报错。 了解了这些基本知识后我们可以介绍inline声明和定义不能分离的原理了。
如果我们inline函数声明与定义分离像这样 那么在编译后inline函数展开形成的地址不会进入符号表但是头文件里函数的声明会将Add函数汇总合并到符号表里因为只是声明没有有效地址当编译器真的根据这个无效地址去找函数的定义时就报错了。 这就是为什么inline函数声明和定义不可以分离。