gpt4 book ai didi

c++ - 在 C 或 C++ 中处理循环依赖的最佳方法?

转载 作者:行者123 更新时间:2023-11-30 16:38:08 33 4
gpt4 key购买 nike

在 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 也是如此。)

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

<小时/>

但是,有人告诉我在 C 语言中这是一个不好的做法,因为 typedef 应该创建另一种类型,并且可能与之前相同的 typedef 冲突,以防多个类型包含。

他还告诉我,出于这些原因,任何声明都不应该出现在 header 防护之外。

因此,他建议我在 b.h 中声明我的 struct B 之前放置一个 typedef struct A A;(反之亦然)反之亦然),因为这是我需要它的地方。

我的问题是:

在这种情况下,在 b.h 中丢失 typedef .. A; 不是很危险吗?

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

最佳答案

处理此类依赖关系的最佳实践通常是避免它们。但这并不总是可能的。

我会这样做:

啊啊

#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++ 中都有效。

前向声明应尽可能简单,因此应避免其中的 typedef,这在本例中很简单。这仅意味着您必须在 B 的定义中使用 struct A* 而不是 A*

关于包含防护之外的 typedef:这绝对不是标准做法。

乍一听可能很诱人,#include "a.h" 确保存在 struct A 的前向声明。问题是,struct A 可能是不完整类型这一点不再明显。

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

关于c++ - 在 C 或 C++ 中处理循环依赖的最佳方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47607018/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com