04-头文件-依赖关系的静态表达
头文件——依赖关系的静态表达
依赖关系在代码里有两个层面的表现:运行期的动态调用(A 调用 B 的函数)和编译期的静态包含(A 包含 B 的头文件)。头文件是依赖关系的静态表达——它把「谁依赖谁」写在文件层面,不运行就能看到。这一条线:头文件如何表达依赖、它表达了什么依赖、不表达什么依赖。
一、依赖的两种表现:动态调用 vs 静态包含
1 | 运行期依赖(动态):A 调用 B 的函数 → 程序运行时才发生 |
1 | // a.c |
静态包含是动态调用的前提——如果不包含 b.h,连 b_func 都声明不了,更谈不上调用。所以头文件表达的是「能依赖什么」,调用表达的是「实际依赖了什么」。
二、头文件表达的三层依赖
1. 包含关系 = 编译期依赖(构建依赖)
1 | a.c 包含 b.h |
2. 声明 = 对符号的依赖
头文件里用到的类型、函数、常量,都是对某个符号的依赖:
1 | // a.h |
看头文件里的声明,就知道这个模块离不开谁。
3. 包含图 = 静态依赖图
把整个项目的 include 关系画出来,就是一张静态依赖图:
1 | main.c ──→ app.h ──→ service.h ──→ domain.h |
这张图不运行代码就能得到——它是依赖关系的「静态快照」。
三、头文件表达什么、不表达什么
1 | 头文件表达的: |
头文件给的是「依赖事实」,不是「依赖是否合理」——事实用它看,合理性要靠审查(见工程控制主题的审查线)。
四、和其他线的关系
1 | 头文件(静态表达)←→ 依赖关系的演化(本主题 01) |
收束
1 | 依赖有两种表现: |
All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.
