2012-04-20 84 views
0

我在庫中有幾個結構:邊,頂點,圖。 我希望隱藏結構的身體從用戶(用戶必須使用API​​),所以在頭文件(如edge.h。)我只是把:在自己的庫中取消引用指向不完整類型的指針

typedef struct edge edge_t; 

和邊緣結構的定義是在edge.c

struct edge {...}; 

工作正常,但我不想從我自己的代碼隱藏結構的身體。我想在edge.c中使用:

vertex_t v; 
v.some_attribute = x; 

現在我得到解除指向不完整類型錯誤的指針,是否可以解決這個問題? 是否有任何其他選項使用訪問器(如用戶)的所有結構元素?

+1

如果結構的結構在庫中是已知的,它不是不完整的類型。只有在你的庫中使用的頭文件定義了結構和一個只導出抽象類型的公共頭文件。 – 2012-04-20 10:41:39

回答

5

如果您需要使用其他源文件的結構,則需要完整的結構定義。因此,解決方案是將struct edge { /* ... */ }也放在頭文件中,並在需要時包含頭文件。

2

Joachim Pileborg是正確的。

編譯器需要知道結構的大小才能使用它。您可以防止這種情況的唯一方法是強制用戶使用指針。

typedef struct edge *edge_t;

編譯器知道指針的大小,從而知道它需要多大的空間分配給它。

+0

當涉及'malloc'時'typedef'指針可能會導致各種問題。人們忘記了'typedef'是一個指針。最好在代碼中加以明確 – 2012-04-20 10:49:27

+0

至少後綴一個typedef指針來清楚說明,'typedef struct edge * edge_ptr;'不太可能被混淆。 – 2012-04-20 11:00:08