C头文件之间的循环依赖

时间:2017-09-11 07:53:22

标签: c header

有没有人知道如何处理符号常量和类型 以系统方式定义大型程序以避免循环依赖 头文件之间?我有一个想法来定义一个头文件 包含所有结构,联合和枚举类型定义以及另一个头文件 它将包含所有符号常量定义。但到目前为止我有疑虑 作为关于实现隐藏的这个解决方案。谢谢你的任何想法。

3 个答案:

答案 0 :(得分:1)

您可以将typedef语句与实际struct定义分开,并在包含其他标题之前放置它们。这样,如果您的数据类型foo包含类型为bar *的成员,则它不需要立即定义bar - 它会很高兴知道它和&{ #39;一种有效的数据类型,稍后将得到解决。

#ifndef FOO_H
#define FOO_H

typedef struct foo_s foo;

#include "bar.h"

struct foo_s
  {
  bar *my_bar;
  };
#endif

#ifndef BAR_H
#define BAR_H

typedef struct bar_s bar;

#include "foo.h"

struct bar_s
  {
  foo *my_foo;
  };
#endif

答案 1 :(得分:0)

解决方案是简单地使用某种程序设计方式。程序中的每个“对象”/“模块”应包含一个h文件和一个c文件。 h文件是公共接口。每个这样的对象应该只关注它自己的指定任务。它应该只包括执行该任务所需的资源。

有了这样的设计,就不应该存在任何循环依赖,或者设计存在缺陷。你不应该用各种代码技巧来修复糟糕的设计,你应该重新进行设计。

但是当然可以从代码的不同部分多次包含相同的资源。这就是为什么我们总是在每个单独的h文件中使用标题保护。

答案 2 :(得分:-1)

在任何给定的头文件中,输入

#ifndef FILENAME_H
#define FILENAME_H

struct a {}
union b {}

function c();
#endif

这将导致文件只被包含一次。