我有两个相互依赖的标题,两者都有保护。但编译失败,好像未声明类型:
error: unknown type name Type_1
第一个标题:
#ifndef HEADER1_H
#define HEADER1_H
#include "header2.h"
typedef struct {
int a;
char *b;
} Type_1;
void function(Type_3 *type_3);
#endif
第二个标题
#ifndef HEADER2_H
#define HEADER2_H
#include "header1.h"
typedef struct {
int a;
char *b;
Type_1 *c;
} Type_2;
typedef struct {
int a;
char *b;
Type_2 *c;
} Type_3;
#endif
如何在不诉诸黑客的情况下解决问题?
答案 0 :(得分:1)
您必须转发声明至少一个结构。我个人把它们全部放在一个标题中,因为那里没那么多。
第一个标题:
#ifndef HEADER1_H
#define HEADER1_H
#include "header2.h"
typedef struct Type_1 {
int a;
char *b;
} Type_1;
void function(Type_3 *type_3);
#endif
第二个标题:
#ifndef HEADER2_H
#define HEADER2_H
struct Type_1;
typedef struct {
int a;
char *b;
struct Type_1 *c;
} Type_2;
typedef struct {
int a;
char *b;
Type_2 *c;
} Type_3;
#endif
答案 1 :(得分:0)
将所有类型定义移动到一个文件和函数声明到另一个。
那么header1.h
#ifndef HEADER1_H
#define HEADER1_H
typedef struct {
int a;
char *b;
} Type_1;
typedef struct {
int a;
char *b;
Type_1 *c;
} Type_2;
typedef struct {
int a;
char *b;
Type_2 *c;
} Type_3;
#endif
header2.h
#ifndef HEADER2_H
#define HEADER2_H
#include "header1.h"
void function(Type_3 *type_3);
#endif
答案 2 :(得分:0)
当您将结构用作不完整的数据类型时,前向声明就足够了:
#ifndef HEADER2_H
#define HEADER2_H
struct Type1;
typedef struct Type1 Type1;
typedef struct {
int a;
char *b;
Type_1 *c;
} Type_2;
typedef struct {
int a;
char *b;
Type_2 *c;
} Type_3;
#endif
将相同的技术应用于第二个文件。但是,在源代码中,如果不将结构用作不完整类型,则需要包含标题。有关不完整数据类型的详细信息,请参阅此MSDN article