如当前所写,您的示例未显示您在问题中提到的相互交叉引用。
必须告诉编译器它使用的每种类型。您可以header_1.h
只使用:
typedef struct Mode Mode;
typedef struct
{
Mode **modes;
} Library;
至少,这将使它编译。编译器不需要详细信息,但它确实需要知道这Modes
是一种类型。
编辑:
请注意,header_2.h
应该对其进行修改以使其正常工作。您必须确保每个typedef
都只出现一次。设置好 typedef 后,只需指定结构内容(定义)一次,然后从结构定义中省略关键字typedef
和 typedef 名称。您必须准确地决定要管理的交叉引用。例如,无论如何都应该header_1.h
包括在内。header_2.h
我不记得遇到过我真的需要相互引用结构的情况(在相当长的编程时间里——长到我可能忘记了一个例子)。 我现在确实记得一个结构相互引用的例子。它是make
最初为 Minix 编写的版本。我仍然认为这样的要求有点“病态”(或者,如果您愿意,可以说是“代码气味”)并且尽可能避免。如果您真的必须管理它,那么下面的部分将解释我将如何去做(以及或多或少的make
程序是如何去做的)。
相互引用的结构
如果你真的有两个相互引用的结构,你应该(重新)考虑为什么你认为两个标题比一个好。如果您仍然需要两个标头,请使用以下成语:
header_1.h
#ifndef HEADER_1_H_INCLUDED
#define HEADER_1_H_INCLUDED
#ifndef TYPEDEF_MODE
#define TYPEDEF_MODE
typedef struct Mode Mode;
#endif
#ifndef TYPEDEF_LIBRARY
#define TYPEDEF_LIBRARY
typedef struct Library Library;
#endif
struct Library
{
...
Mode **modes;
...
};
#endif /* HEADER_1_H_INCLUDED */
header_2.h
#ifndef HEADER_2_H_INCLUDED
#define HEADER_2_H_INCLUDED
#ifndef TYPEDEF_MODE
#define TYPEDEF_MODE
typedef struct Mode Mode;
#endif
#ifndef TYPEDEF_LIBRARY
#define TYPEDEF_LIBRARY
typedef struct Library Library;
#endif
struct Mode
{
...
Library **liblist;
...
};
#endif /* HEADER_2_H_INCLUDED */
重复typedef
的“检测”代码不好;在我看来,单个标题更好。但是,您可以按任一顺序包含header_1.h
及header_2.h
以上,它应该可以编译。