把十年多的 BBS source code porting 到 Ubuntu 上,被迫要用 GCC 4.6 而一路找出來的...
在 BBS 內有這樣的資料結構要處理:
typedef struct p { struct p *pointer; } P; static P p1 = { &p2 }; static P p2 = { &p1 };
兩個要互指,但在指定 p1 時 p2 還沒有被定義,所以要用 extern 先宣告:
typedef struct p { struct p *pointer; } P; extern P p2; static P p1 = { &p2 }; static P p2 = { &p1 };
這個語法在舊版的 GCC 沒問題 (3.4),但在新版的 GCC 4.6 上不接受這個寫法,會抱怨後面的 p2 實際在宣告是 static,與前面的 extern non-static 不符。
後來在 Stack Overflow 上找到「static extern vs extern static」這篇說明,要先定義 static 再定義 extern:
static P p2; extern P p2;
這樣寫的原因在原文的下方有說明,所以是 C99 定義的關係?