处理C或C 中环状依赖的最佳方法
Best way to deal with cyclic dependancies in C or C++?
在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
可能是不完整的类型。
正向声明也是对未来读者的警告,他们可能正在处理不完整的类型。
相关文章:
- 在C#中处理C++指针而不使用unsafe的最佳方法
- 在C++中,将大的无符号浮点数四舍五入为整数的最佳方法是什么
- 实现无开销push_back的最佳方法是什么
- 在C++中向零方向近似的最佳方法
- 使用不同的CRT将新的C++代码与旧的(二进制)组件隔离开来的最佳方法是什么
- 检测win32服务创建和删除的最佳方法
- 在C++中样板"冷/never_inline"错误处理技术的最佳方法是什么?
- 在 c++ 中对类中的 c 字符串动态数组进行排序的最佳方法是什么?
- 将线程中的数据存储到全局容器的最佳方法?
- 将一系列整数放入类的最佳方法是什么?
- 在派生类中使用基类的私有成员变量的最佳方法
- 在 C++ 中将非指定类型作为参数传递的最佳方法?
- Qt - QVector 和模型视图 - 从列表视图获取自定义类的最佳方法是什么?
- 使用 Git 处理 C++ Visual Studio 2019 解决方案的外部依赖项源代码管理的最佳方法是什么?
- 比较两个节点坐标的最佳方法是什么?
- 在nodejs中使用本机代码的最佳方法是什么?
- 将 pybind11 绑定标记为已弃用的最佳方法
- C++:将向量传递到构造函数以创建成员变量的最佳方法?
- C++中变量混叠的最佳方法
- 读取大文件(>2GB)(文本文件包含以太网数据)并通过不同参数随机访问数据的最佳方法是什么?