c - 使用前向声明解决循环依赖
问题描述
对于这个问题,请忽略与相互依赖相关的软件设计问题,而专注于技术方面。
请考虑两个头文件a.h
和b.h
. 文件a.h
定义了一些b.h
需要的结构。但是, b.h
还定义了一个a.h
需要的结构。
据我了解,解决这种循环#include
依赖的常用技术b.h
不是 include a.h
,而是前向声明它需要 from 的结构定义a.h
。这看起来像这样:
啊
// No nice typedef
struct MyThing_t {
// ...
};
溴化氢
// Other things omitted
typedef struct MyThing_t MyThing;
// ... proceed using MyThing
据我了解,这应该可以编译和工作。
但是 - 为什么它会起作用?MyThing_t
编译器在编译时如何知道名称b.h
?这里的机制是什么?
另外 - 为什么我不应该包含typedef
也 in a.h
, 以便通过使用a.h
没有循环依赖的模块来使用?
解决方案
处理这种情况最直接的方法是在不同的标头中定义结构,例如basic.h
或类似的标头,a.h
并b.h
包含该标头。因为在b.h
这
typedef struct MyThing_t MyThing
前向声明声明了一个不透明的类型,它只允许你使用一个MyThing*
指针。因为b.h
不知道结构的实际大小或内存布局是什么。这实际上是一个非常常见的 C 习惯用法,因为它允许封装结构的内部,并允许在头文件中声明对该指针进行操作的函数,而无需知道其实现。
推荐阅读
- javascript - 这是哪种时间戳格式,例如:20180130T043000Z
- python - 使用熊猫将csv文件中的列范围分配给变量
- c# - 使用 InvokeMember 使用 DLL 的问题:会话混合(覆盖)
- angular - Angular - 错误:初始超出最大预算。预算 5.00 MB 未达到 197.06 kB 总共 5.19 MB
- blockchain - 如何为初创公司创建加密钱包(比特币和以太坊)?
- javascript - 将音频播放器附加到按钮
- npm - npm 运行构建缺少的文件 - vitejs
- javascript - 如何组合 2 个 JSON 对象?
- flutter - Dart/Flutter 中的编码需要我的第一个 Tile 只出现一次
- javascript - 如何在nodejs中过滤多级类别