c - 使用前向声明解决循环依赖

标签 c circular-dependency

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

请考虑两个头文件,a.hb.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.hb.h 都包含该 header 。因为在 b.h 中这个

typedef struct MyThing_t MyThing

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

关于c - 使用前向声明解决循环依赖,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55978064/

相关文章:

c++ - 为什么libeay32中SHA512函数的符号没有前导下划线?

java - Maven 循环依赖与多模块项目

c++ - Arduino 静态变量声明没有数据类型?

c - 低于低级别的普通 bsd 套接字

c - 将第i个数组指针设置为c中的变量

delphi - 两个类有两个循环引用

C++循环包含

java - 这是循环依赖吗?

python-3.x - python3中的循环导入

c - 有没有比使用 backtrace() 更便宜的方法来查找调用堆栈的深度?