处理C或C 中环状依赖的最佳方法

Best way to deal with cyclic dependancies in C or C++?

本文关键字:最佳 方法 依赖 处理      更新时间:2023-10-16

在C中,当我需要时:

文件a.h

#ifndef A_H
#define A_H
#include "b.h"
typedef struct A { B* second_struct; } A;
#endif /* !A_H */

文件b.h

#ifndef B_H
#define B_H
#include "a.h"
typedef struct B { A* first_struct; } B;
#endif /* !B_H */

我以这种方式自由重新排列:

typedef struct A A;
#ifndef A_H
...

b.h也是如此。)

我在标题的第一行中使用class A;在C 中做了完全相同的事情。


但是,有人告诉我这是一个不好的做法,因为typedef应该创建另一种类型,并且在多个包含的情况下可能与以前的typedef发生冲突。

他还告诉我,出于这些原因

所以,他建议我在声明我的struct B(和vice-viss-a)之前将typedef struct A A;放在b.h中,因为它是我需要的地方。

我的问题是:

在这种情况下,在b.h中丢失了typedef .. A;吗?

更一般而言,处理这种依赖性的最佳实践是什么?

处理这种依赖性的最佳实践是避免它们。

并不总是可能的。

我会这样做:

A.H

#ifndef A_H
#define A_H
#include "b.h"
// Forward decls
struct B;    
typedef struct A { struct B* second_struct; } A;
#endif /* !A_H */

b.h

#ifndef B_H
#define B_H
#include "a.h"
// Forward decls
struct A;
typedef struct B { struct A* first_struct; } B;
#endif /* !B_H */

在C和C 中都是有效的。

应该尽可能地保持前向声明,以便避免使用其中的类型,在这种情况下很简单。这仅表示您必须在b。

的定义中使用 struct A*而不是 A*

关于包含后卫以外的Typedefs:绝对不是标准练习。

最初听起来很诱人,#include "a.h"确保存在struct A的正向声明。问题是,struct A可能是不完整的类型。

正向声明也是对未来读者的警告,他们可能正在处理不完整的类型。