2017-05-27 45 views
0

我有一個頭文件(.h)與下面的聲明。在主程序中使用自定義LinkedList庫;存儲大小是未知的

typedef struct LinkedList LinkedList; 

後記我LinkedList.c文件我有以下

#include "LinkedList.h" 
typedef struct Node {...} Node; 
struct LinkedList { 
Node *head; 
int size; 
} LinkedList; 

此設置類似於一個,我發現了here與不同之處在於我沒有定義的數據成員我的.h文件中LinkedList的結構(因爲我想保持節點的東西是私有的)。頭文件的我的understanding是任何私有結構都是在實現中定義的(即在.c文件中)。這是做這件事的正確方法嗎?我在LinkedList.c文件中有一個initializeList函數,其中我將initalize size設置爲0並且指向NULL。

我然後編譯成使用

gcc -o LinkedList -c LinkedList.c 

here方向以下一個庫文件這一點。

然後我有一個main.c文件,在那裏我有以下

#include <stdio.h> 
#include <stdlib.h> 
#include "LinkedList.h" 

int main() 
{ 

LinkedList list1; 
initializeList(list1); 
for(int index = 1; index <= 5; index++) 
{ 
    int input; 
    printf("Enter num: "); 
    scanf("%d", input); 
    insertNthPosition(list1, input, index); 
} 

for(int index = 1; index <= 5; index++) 
{ 
    printf("\n%d\n", getNthValue(list1, index)); 
} 
return 1; 

} 

當我使用 gcc -o main main.c我收到以下錯誤

的「列表1」

存儲大小是不知道

+0

編輯OP澄清,我使用#include語句在我LinkedList.c文件中做了這樣的事 – user278039

+0

時,通常預期的'LinkedList'是一個不透明的類型'main.c'。變量不能被聲明爲不透明類型,只能作爲指向不透明類型的*指針。 – kaylum

+0

這是否意味着我將不得不東西'鏈表*列表1 =的malloc(的sizeof(結構鏈表));' – user278039

回答

0

的一點是要保持節點聲明私有:因爲這個原因把在LinkedList.h此聲明:

typedef struct Node NodeType; 
typedef struct LinkedList { 
struct Node *head; 
int size; 
} LinkedListType; 

,將公開宣佈LinkedListType,而不是節點類型。不過,這個標題指出NodeType(和struct Node)確實存在。

然後把節點類型的實際申報的LinkedList.c文件。

現在從任何其他翻譯單元,你可以訪問LikedList情況下,太訪問節點類型指針字段,但因爲你不知道實際的定義,你永遠不應該取消對它的引用。

還要注意的是,當您創建主可執行你錯過了鏈接到你之前「GCC -c」選項創建LinkedList的目標文件。無論如何,我會建議您創建一個庫並將其交付給鏈接列表的客戶端(而不是目標文件)。

更新: 正如評論指出,這是隱藏你的鏈表的實現細節,以及最佳實踐不只是Node類型的,因爲你在你的問題中提到。 請創建一個公開,接受並返回指針LinkedListType *函數鏈表庫。讓你的客戶只處理指向LinkedListType的指針。這就是所謂的不透明指針:你知道它的存在,但你不能解引用它,因爲你不知道它的定義。

+0

爲什麼'LinkedListType'必須公開? OP正試圖隱藏其中的一部分。因此,答案可以的,如果你解釋如何可以實現(以同樣的方式爲你描述如何做到這一點的'NodeType')得到改善。 – kaylum

+0

我同意,我被這句話引導「我想保持節點的東西私」 :)最後,什麼OP想要的是使用LinkedListType作爲一個不透明的指針,永遠取消對它的引用,但在任何地方使用它作爲一個指針,並且由LinkedList庫導出的函數應該接受/返回指向該類型的指針:) –

-1

我不認爲對標題做的typedef,然後定義在.c文件的結構是一個好主意。
想象一下另一個文件想要使用這個結構。然後你需要重新輸入這個結構。
最後,這是頭文件的全部要點。他們只是複製粘貼。
所以,如果你只需要在一個文件中的結構,在這個文件中定義結構。如果你需要這個結構體來處理多個文件,在頭文件中定義這個結構體並將它包含在這兩個文件中。

+0

這完全錯了。僅在.c文件中定義結構的意義在於,結構字段*不能在該文件之外訪問。這是從客戶端代碼隱藏庫實現的完善方法。其中一個例子是C標準的FILE類型。 – kaylum

相關問題