2017-05-27 50 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

相关问题