2010-09-22 201 views
4

假设你有2个文件中定义如下图所示的相关结构:C递归头文件包含问题?

啊内容:

#include b.h 

typedef struct A 
{ 
    B *b; 
} A; 

BH内容:

#include a.h 

typedef struct B 
{ 
    A *a; 
} B; 

在这种这种情况下,这个递归包体问题,但2个结构必须指向其他结构,如何实现这一点?

回答

2

Google C/C++ guidelines suggests

不要使用#include时预先声明就足以

那会意味着:

啊内容:

typedef struct B B; 

typedef struct A 
{ 
    B *b; 
} A; 

bh内容:

typedef struct A A; 

typedef struct B 
{ 
    A *a; 
} B; 

如果你喜欢的东西多了一点安全(但更长的时间来编译),你可以这样做:

A.H内容:

#pragma once 
typedef struct A A; 

#include "B.h" 

typedef struct A 
{ 
    B *b; 
} A; 

湾h内容:

#pragma once 
typedef struct B B; 

#include "A.h" 

typedef struct B 
{ 
    A *a; 
} B; 
+0

只是为了我的好奇心,'#pragma once'是什么? – 2010-09-22 12:25:52

+0

这是一种新的方法(几乎支持任何编译器)执行'#ifndef MY_HEADER_H__ #define MY_HEADER_H__ ...#endif'。这意味着如果你有#include“foo.h”两次,而foo.h有'#pragam once',它将只应用一次声明。否则你会遇到编译错误。 – Wernight 2010-09-22 12:29:05

2

您预先定义只有结构,以这种方式你仍然可以声明指针:

a.h

typedef struct B_ B; 

typedef struct A_ 
{ 
    B *b; 
} A; 

注意我是如何使用的typedef和struct标记不同的名字,以使它更清晰一点。

1

这将削减它在C:

typedef struct B B; 
typedef struct A A; 
struct A { B *b; }; 
struct B { A *a; }; 

您可以根据需要重新安排BA

4

不要#包括啊和bh,只是向前声明A和B.

啊:

struct B; //forward declaration 
typedef struct A 
{ 
    struct B * b; 
} A; 

BH:

struct A; //forward declaration 
typedef struct B 
{ 
    struct A * a; 
} B; 

你可能要考虑如何紧密耦合的类是。如果它们紧密结合,那么它们可能属于同一个标题。

注意:在.c文件中,您需要#include这两个文件中的a.h和b.h来执行诸如a->b->a之类的操作。