【问题标题】:Unkown type name - possible circular dependency in C未知类型名称 - C 中可能的循环依赖
【发布时间】:2017-02-03 11:19:20
【问题描述】:

我在编译代码时遇到问题。我猜它是循环依赖,但无论如何我的问题是如何读取 gcc 告诉我的输出。我得到这样的东西:

In file included from src/./../lib_ex/./../lib_ex/./../lib_ex/./../lib_ex/trav_item.h:7:0,
             from src_core/./../lib_ex/./../lib_ex/./../lib_ex/path.h:11,

然后列出的错误之一是这样的: 来自

src_core/main.c:8: src_core/./../lib_ex/./../lib_ex/./../lib_ex/./../lib_ex/./../lib_ex/bubble.h:22:2: error: unknown type name ‘Path’

所以我想知道现在在哪里检查问题,如上所述,它列出了标题 path.h 和 trav_item.h 但下面提到了另一个bubble.h

所以在我的标题 path.h 中我有以下条目(只是缩短了看看我是否确实有一个 ciruclar 依赖项:

#include "./../lib_ex/trav_item.h"

struct Traversal_item;

typedef struct Path {

  int ID;
  char* ex;
  Traversal_item* ti;
}  Path;

在 trav_item.h.i 中有这个:

 #include "./../lib_ex/bubble.h"
 #include "./../lib_ex/path.h"

 struct Path;


 typedef struct Traversal_item {
   // some variables
   Path* path;
 } Traversal_item;

所以我认为我必须预先定义结构路径才能在此处使用它,但显然我仍然做错了什么:/。

哦,在 bubble.h 中,我还包含了 path.header:

   #include "./../lib_ex/path.h"

   typedef struct {
     Path* path;
   } BBL;

【问题讨论】:

  • 您可能有一些文件(未显示)包含一个或多个这些标头,但在仅给出前向声明时使用结构。例如,要访问结构成员,前向声明是不够的。
  • 有这样的相互依赖关系,将三个包含文件合并为一个不是更好吗?

标签: c


【解决方案1】:

当你这样做时

struct Path;

您只是对名为Path结构 进行前向声明,而不是类型别名Path。因此使用类型别名将导致您遇到的错误(因为没有名为Pathtype)。

有两种解决方案:要么进行类型别名的前向声明

typedef struct Path Path;

或者在Traversal_item结构中使用

struct Path *path;

Traversal_itempath.h 头文件中的相同。

【讨论】:

  • 感谢您指出这一点。但是我在这里对程序的结构做错了吗?我想,你在标题中定义你的结构,如果你想在 c 文件中使用它们来包含标题,对吧?
  • 还有一个问题,如果在那个 header/c 文件中函数使用结构的某些成员,我也可以做这个前向声明,因为那时它们还没有定义:/
猜你喜欢
  • 1970-01-01
  • 2018-10-27
  • 2013-10-21
  • 1970-01-01
  • 1970-01-01
  • 2013-09-25
  • 1970-01-01
  • 2014-01-28
  • 2012-02-06
相关资源
最近更新 更多