定義兩個相互指向的結構體 even_box 與 odd_box,直接使用 typedef 時編譯器報錯,提示類型未定義。
typedef struct _even_box {
int number;
odd_box *next; // 錯誤:odd_box 尚未聲明
} even_box;
typedef struct _odd_box {
int number;
even_box *next;
} odd_box;
C 語言編譯為單遍掃描,當解析 even_box 時,odd_box 尚未被識別為類型名,導致指針聲明失敗。
/* 1. 前向聲明結構體標籤 */
struct odd_box;
/* 2. 定義 even_box,使用結構體標籤 struct odd_box */
typedef struct even_box {
int number;
struct odd_box *next;
} even_box;
/* 3. 定義 odd_box,此時 even_box 已完整定義 */
typedef struct odd_box {
int number;
even_box *next;
} odd_box;
struct odd_box; 告訴編譯器「有一個名為 odd_box 的結構體存在」,無需完整定義。even_box 內部使用 struct odd_box *,而非 odd_box *。odd_box 的完整定義,此時 even_box 已可直接使用別名。若需在多文件中使用,建議在頭文件中僅放前向聲明與 typedef,具體定義放入 .c 文件,配合 extern 導出,實現接口與實現分離。
掌握前向聲明技巧,輕鬆破解 C 語言互遞歸結構體定義難題,編寫更健壯的數據結構代碼。