2010-09-22 123 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之類的操作。