2014-11-25 54 views
0

在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文件包含定義。

+1

庫供應商應該提供自己,運頭向前聲明具有穩定的typedef名稱。然後供應商可以改變內心的名字,讓她心中高興,你永遠不會知道。 – 2014-11-25 11:34:02

回答

2

使用2包括文件:

blabla.h

#include "light_dependencies.h" 
typedef struct sBlaBlaFooBar BlaBlaFooBar; 

blabla_internal。^ h

#include "blabla.h" 
#include "heavy_dependencies.h" 
struct sBlaBlaFooBar { 
    ... 
}; 

blabla.c

#include "blabla_internal.h" 
/* Here is code which deals with the internals of the struct */ 

usercode.c

#include "blabla.h" 
/* Here is code which only passes struct pointers around */ 
+0

這似乎是最好的方法。創建一個只需轉發的頭部即可聲明結構,以便可以使用一致的前向聲明。所以只有真正需要的頭文件必須包含結構定義及其所有的依賴關係。 – 2014-11-25 12:26:46

+0

獲得不透明指針的好方法。比使用'void *'更好,因爲這樣你就可以保持強大的輸入。 – 2014-11-25 13:01:56