首先,你似乎缺乏在.h
文件include guards,所以你包括他們遞歸。那很不好。
其次,你可以做一個前向聲明。在Move.h
:
/* Include guard to make sure your header files are idempotent */
#ifndef H_MOVE_
#define H_MOVE_
#include "Board.h"
/* Now you can use struct Board */
struct Move { struct Board *board; };
#endif
在Board.h
:
#ifndef H_BOARD_
#define H_BOARD_
struct Move; /* Forward declaration. YOu can use a pointer to
struct Move from now on, but the type itself is incomplete,
so you can't declare an object of the type itself. */
struct Board { struct Move *move; }; /* OK: since move is a pointer */
#endif
請注意,如果您需要在這兩個文件來聲明struct Move
和struct Board
對象(而不是指向其中之一),這種方法不會工作。這是因爲在解析其中一個文件(在上例中爲struct Move
)時,其中一種類型是不完整類型。因此,如果您需要在兩個文件中使用這些類型,則必須將類型定義分開:具有定義struct Move
和struct Board
的頭文件,以及其他任何東西(類似上面的示例),然後使用另一個引用struct Move
和struct Board
的頭文件。
當然,你不能有struct Move
包含struct Board
和struct Board
包含struct Move
同時—這將是無窮遞歸和結構尺寸將會是無限的!
注意,在一個理想的世界裏,你避免循環依賴這樣的。它當然不總是可能的,有時它們可能非常有用,但是當你創建一個循環依賴時,你應該花一點時間思考它併爲它的存在辯護。 – 2010-01-11 21:53:58
@Greg D - 我接受了你的建議,並創建了另一個名爲Types.h的文件,我在這裏完成了所有的#define-ing和typedef-ing。我將它包含在兩個文件中,並且一切都很好! – twolfe18 2010-01-11 22:16:22