在C中,通常結構都是typedefed,以避免在任何地方編寫struct。typedefed結構的前向聲明
在標題中使用此名稱作爲不透明指針參數時,必須轉發聲明它們。整個typedef必須重複,這是相當煩人的。
實施例:
一些頭定義了一些類型:
typedef struct sBlaBlaFooBar{
int someData;
}BlaBlaFooBar;
一些其他的頭使用該結構指針參數。但是爲了避免巨大的包含依賴關係BlaBlaFooBar.h不應該被包含,並且只使用前向聲明。
所以你必須寫typedef struct sBlaBlaFooBar BlaBlaFooBar;
轉發聲明它。
這讓我很不舒服,因爲通常情況下它並不重要,所以我必須知道結構的標記名。如果它改變了,所有的前向聲明也必須改變,即使typename是相同的。
有沒有一些明智的解決方法呢?
更詳細的解釋:
- 很多與結構定義頭(可能也是由結構(只是爲了顯示深的依賴關係圖))
- s1.h
- s2.h
- s3.h
- s4.h
- 一個BlaBlaFooBar頭與
BlaBlaFooBar
結構是所有這些的組合。 - 的附加結構BlaBlaBarFoo用類似的拓撲結構(來自其它子結構)
- 然後模塊,其限定新的結構
NewStruct
和功能NewStruct_create(NewStruct* out, const BlaBlaFooBar* in);
其處理 上述結構作爲輸入。這些頭文件只需要typedef,只有實現必須知道確切的BlaBlaFooBar
結構定義。 - 只能在
NewStruct
上工作的附加模塊,如果BlaBlaFooBar
更改,則不一定需要重新編譯。
所以爲了避免這種依賴關係,結構必須在頭文件中進行前向聲明,並且c文件包含定義。
庫供應商應該提供自己,運頭向前聲明具有穩定的typedef名稱。然後供應商可以改變內心的名字,讓她心中高興,你永遠不會知道。 – 2014-11-25 11:34:02