Module Development
2022-08-31
2分钟阅读时长
Module Develop
一般地,C 中的模块化开发可以归纳为:
- 在头文件中定义接口
- 在源文件中实现接口
- 链接模块
一般地,C++中的模块化开发可以归纳为:
- 在声明类的头文件中定义接口
- 在实现类的源文件中实现接口
- 链接模块
Head files
头文件包含“防止重定义”,定义类型,文件包含,宏定义,条件编译,函数和变量声明等部分。
Redefinition
模块间依赖关系复杂,可能存在重定义的情况。
有鉴于此,需要对头文件定义的内容作“保护”处理。
-
法一,宏定义法 该方法依赖于宏名不能冲突。它既可以保证同一个文件不会被多次包含,又能保证内容完全相同的两个文件不会被同时包含。
#ifndef FILE_H_ #define FILE_H_ //声明函数原型 int add(int,int); int sub(int,int); #endif
-
法二,编译指令法 该方法由编译器提供保证,即同一个文件不会被包含多次。
该方法有以下缺陷:
- 若存在内容相同的两个文件,则无法保证它们不被重复包含。
- 操作对象是文件整体,不能仅控制部分内容。
该方法是非标准 但被广泛支持的方式。
#pragma once
Macro & Condition Compilation
宏定义指令和条件编译指令见 语句 小节。
Variables Or Functions Statement
变量定义和声明的区别:
- 定义用于为变量分配空间,也可以为变量赋初值。特别地, 定义也是声明。
- 声明用于向其他代码表明变量的信息,特别地,函数声明可以不带形式参数。 仅 声明变量则不会分配空间,而看作是一种 变量作用域的扩充。
Source Files
模块化开发中,可以使用一个头文件定义所有的接口(声明函数),其他各个模块分别实现头文件中定义的功能。
编译模块务必用 -c
选项!否则将报错无法找到程序入口!
Symbol Table
可以使用 nm
命令查看模块的符号表,符号表包含模块使用的符号。
函数的名字,全局变量的名字,静态局部变量的名字都是符号。
特别地, filename
必须是二进制的可执行文件或目标文件。
nm filename
以下内容是个人理解,可能不严谨:
- 用户自定义的头文件可能在编译各个模块时被编译多次,但将会在链接时仅链接一次 多余的目标代码将在链接生成可执行代码时被清理。
- 如果动态链接用户自定义的库文件或标准库中的库文件,则在链接后相关的符号仍然未定义,但会标注链接位置。它们的链接过程推迟到运行时进行。
- 如果静态链接上述内容,则在链接后所有符号均已定义,且相关代码均包含在可执行文件中。