对于这个问题,请忽略与相互依赖相关的软件设计问题,而关注技术方面。
请考虑两个头文件,a.h
和 b.h
。文件a.h
定义了b.h
需要的一些结构。但是,b.h
还定义了 a.h
需要的结构。
据我了解,解决这种循环#include
依赖关系的常用技术是在b.h
中而不是包含a.h
,它会从 a.h
向前声明所需的结构定义。这看起来像这样:
啊啊
// No nice typedef
struct MyThing_t {
// ...
};
B.h
// Other things omitted
typedef struct MyThing_t MyThing;
// ... proceed using MyThing
据我了解,这应该可以编译并工作。
但是 - 为什么它有效?编译器在编译 b.h
时如何识别名称 MyThing_t
?这里的机制是什么?
另外 - 为什么我不应该在 a.h
中包含 typedef
,以供使用 a.h
没有的模块使用循环依赖?
最佳答案
处理这种情况最直接的方法是在不同的 header 中定义结构体,例如 basic.h
或类似的 header ,并具有 a.h
和 b.h
都包含该 header 。因为在 b.h
中这个
typedef struct MyThing_t MyThing
前向声明声明了一个不透明类型,该类型允许您仅使用MyThing*
指针。因为 b.h
不知道该结构的实际大小或内存布局是多少。这实际上是一个非常常见的 C 习惯用法,因为它允许封装结构体的内部结构,并允许在头文件中声明对该指针进行操作的函数,而无需知道其实现。
关于c - 使用前向声明解决循环依赖,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55978064/