首页 > 解决方案 > 使用前向声明解决循环依赖

问题描述

对于这个问题,请忽略与相互依赖相关的软件设计问题,而专注于技术方面。

请考虑两个头文件a.hb.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没有循环依赖的模块来使用?

标签: ccircular-dependency

解决方案


处理这种情况最直接的方法是在不同的标头中定义结构,例如basic.h或类似的标头,a.hb.h包含该标头。因为在b.h

typedef struct MyThing_t MyThing

前向声明声明了一个不透明的类型,它只允许你使用一个MyThing*指针。因为b.h不知道结构的实际大小或内存布局是什么。这实际上是一个非常常见的 C 习惯用法,因为它允许封装结构的内部,并允许在头文件中声明对该指针进行操作的函数,而无需知道其实现。


推荐阅读