有没有人有任何提示如何以系统方式处理大型程序中的符号常量和类型定义以避免头文件之间的循环依赖?我有一个想法,定义一个包含所有结构、联合和枚举类型定义的头文件和另一个包含所有符号常量定义的头文件。但是我对这个关于实现隐藏的解决方案有疑问。谢谢你的任何想法。
您可以将typedef语句与实际struct定义分开,并将它们放在包含其他标题之前。这样,如果您的数据类型foo包含 type 的成员bar *,则它不需要立即定义bar- 知道它是稍后将得到解析的有效数据类型会很高兴。
#ifndef FOO_H
#define FOO_H
typedef struct foo_s foo;
#include "bar.h"
struct foo_s
{
bar *my_bar;
};
#endif
Run Code Online (Sandbox Code Playgroud)
.
#ifndef BAR_H
#define BAR_H
typedef struct bar_s bar;
#include "foo.h"
struct bar_s
{
foo *my_foo;
};
#endif
Run Code Online (Sandbox Code Playgroud)
解决方案是简单地使用某种程序设计方式。程序中的每个“对象”/“模块”应包含一个 h 文件和一个 c 文件。h 文件是公共接口。每个这样的对象应该只关心它自己指定的任务。它应该只包括执行该任务所需的资源。
通过这样的设计,决不应该存在任何循环依赖,否则设计就有缺陷。你不应该用各种代码技巧来修复糟糕的设计,你应该重新设计。
但当然,同一资源可以从代码的不同部分多次包含。这就是为什么我们总是在每个 h 文件中使用标头保护。