假設你有2個文件中定義如下圖所示的相關結構:C遞歸頭文件包含問題?
啊內容:
#include b.h
typedef struct A
{
B *b;
} A;
BH內容:
#include a.h
typedef struct B
{
A *a;
} B;
在這種這種情況下,這個遞歸包體問題,但2個結構必須指向其他結構,如何實現這一點?
假設你有2個文件中定義如下圖所示的相關結構:C遞歸頭文件包含問題?
啊內容:
#include b.h
typedef struct A
{
B *b;
} A;
BH內容:
#include a.h
typedef struct B
{
A *a;
} B;
在這種這種情況下,這個遞歸包體問題,但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;
您預先定義只有結構,以這種方式你仍然可以聲明指針:
在a.h
:
typedef struct B_ B;
typedef struct A_
{
B *b;
} A;
注意我是如何使用的typedef
和struct標記不同的名字,以使它更清晰一點。
這將削減它在C:
typedef struct B B;
typedef struct A A;
struct A { B *b; };
struct B { A *a; };
您可以根據需要重新安排B
和A
。
不要#包括啊和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
之類的操作。
只是爲了我的好奇心,'#pragma once'是什麼? – 2010-09-22 12:25:52
這是一種新的方法(幾乎支持任何編譯器)執行'#ifndef MY_HEADER_H__ #define MY_HEADER_H__ ...#endif'。這意味着如果你有#include「foo.h」兩次,而foo.h有'#pragam once',它將只應用一次聲明。否則你會遇到編譯錯誤。 – Wernight 2010-09-22 12:29:05