Module Development

2022-08-31
2分钟阅读时长

Module Develop

一般地,C 中的模块化开发可以归纳为:

  1. 在头文件中定义接口
  2. 在源文件中实现接口
  3. 链接模块

一般地,C++中的模块化开发可以归纳为:

  1. 在声明类的头文件中定义接口
  2. 在实现类的源文件中实现接口
  3. 链接模块

Head files

头文件包含“防止重定义”,定义类型,文件包含,宏定义,条件编译,函数和变量声明等部分。

Redefinition

模块间依赖关系复杂,可能存在重定义的情况。

有鉴于此,需要对头文件定义的内容作“保护”处理。

  1. 法一,宏定义法 该方法依赖于宏名不能冲突。它既可以保证同一个文件不会被多次包含,又能保证内容完全相同的两个文件不会被同时包含。

      #ifndef FILE_H_
      #define FILE_H_
      //声明函数原型
      int add(int,int);
      int sub(int,int);
      #endif
  2. 法二,编译指令法 该方法由编译器提供保证,即同一个文件不会被包含多次。

    该方法有以下缺陷:

    1. 若存在内容相同的两个文件,则无法保证它们不被重复包含。
    2. 操作对象是文件整体,不能仅控制部分内容。

    该方法是非标准 但被广泛支持的方式。

      #pragma once

Macro & Condition Compilation

宏定义指令和条件编译指令见 语句 小节。

Variables Or Functions Statement

变量定义和声明的区别:

  1. 定义用于为变量分配空间,也可以为变量赋初值。特别地, 定义也是声明。
  2. 声明用于向其他代码表明变量的信息,特别地,函数声明可以不带形式参数。 声明变量则不会分配空间,而看作是一种 变量作用域的扩充。

Source Files

模块化开发中,可以使用一个头文件定义所有的接口(声明函数),其他各个模块分别实现头文件中定义的功能。

编译模块务必用 -c 选项!否则将报错无法找到程序入口!

Symbol Table

可以使用 nm 命令查看模块的符号表,符号表包含模块使用的符号。

函数的名字,全局变量的名字,静态局部变量的名字都是符号。

特别地, filename 必须是二进制的可执行文件或目标文件。

  nm filename

以下内容是个人理解,可能不严谨:

  1. 用户自定义的头文件可能在编译各个模块时被编译多次,但将会在链接时仅链接一次 多余的目标代码将在链接生成可执行代码时被清理。
  2. 如果动态链接用户自定义的库文件或标准库中的库文件,则在链接后相关的符号仍然未定义,但会标注链接位置。它们的链接过程推迟到运行时进行。
  3. 如果静态链接上述内容,则在链接后所有符号均已定义,且相关代码均包含在可执行文件中。
上一页 File I/O
下一页 Debug Method