相互依赖的标头不编译

时间:2014-02-15 19:51:50

标签: c

我有两个相互依赖的标题,两者都有保护。但编译失败,好像未声明类型:

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

如何在不诉诸黑客的情况下解决问题?

3 个答案:

答案 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