什么是模块化?如何实现?模块化在具体编译的过程是如何表现的?
一、什么是模块化?
在C语言开发中将功能类似的函数集合成一个模块,降低各个功能的耦合性,提升程序的开发效率。比如C语言将字符串有关的函数都封装在STRING.c文件中,需要的时候在从STRING.c模块中调取。
二、如何实现?
模块化的实现首先要明白三个概念,即模块的实现(.c文件)、模块的声明(.h文件)、模块的调用(.c文件),首先是模块的实现,即将具有相同目的或者说特性的函数,与之相关的变量、常量集成到一个.c文件中,并提供相应接口。其次是模块的声明,为调用目标模块的.c文件提供被调用模块的声明(即被调用模块的API接口,说明可以供外部调用的函数、变量有什么功能,是干什么的)。最后是模块的调用,这个最简单,在引入模块的声明后直接调用相关接口(函数、变量、常量)就行。
三、模块化在具体编译的过程是如何表现的?(重点)
首先要掌握C文件编译的过程:预处理、编译、汇编、链接四个过程,那么模块化在这个过程中如何表现?
首先看一下预处理过程:*将 .c 中的头文件展开、宏展开。预处理操作过程不会进行语法检查。*即这个过程将我们模块的声明在调用相应模块的.c文件中展开,这样模块的调用文件(.c文件)中就出现了被调用模块的声明(.h文件),生成的文件是 .i 文件。注意!这个时候模块的实现文件(.c文件)还没登场。
**第二是编译过程:**将预处理之后的 .i 文件生成 .s 汇编文件。对模块的调用文件(.i 文件)进行语法检查*这个时候模块的实现文件(.c文件)依旧还没登场。
**第三是汇编过程:**将 .s 汇编文件生成 .o 目标文件。.o 目标文件就是可以让CPU直接执行的二进制文件,这个时候模块的实现文件依旧没有登场。
第四是链接过程:将 .o 文件链接成 可执行目标文件。这一过程链接器接收目标文件( .o 文件)以及所需的库文件(静态库文件或动态库文件),并将它们组合成一个可执行文件。链接过程涉及解析符号引用,将不同模块之间的引用关系解决,并生成最终的可执行文件。这也包括动态链接(在运行时加载共享库)或静态链接(在编译时将库链接到可执行文件)。在这一过程中我们编写的模块的实现代码才会以库文件的形式与可执行目标文件( .o 文件)链接起来并生成可执行程序exe或out。
看到这里你是否清楚,我们程序员编写的模块实现代码.c是首先单独编译成一个库文件(静态或者动态)、在模块的调用文件(.c文件)编译到链接阶段的时候链接到程序中,最后才生成可执行的程序exe或out。这里先留一个坑,有兴趣的同学可以去查一下静态库文件和动态库文件的区别是什么?
参考文章https://blog.youkuaiyun.com/Michael_lcf/article/details/129042281