在主程序中使用自定义 LinkedList 库;存储大小未知

Using custom LinkedList library in a main program; storage size isn't known

我有一个包含以下声明的头文件 (.h)。

typedef struct LinkedList LinkedList;

我的 LinkedList.c 文件中的后记如下

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

此设置与我在 with the difference being that I did not define the data members of the struct of LinkedList in my .h file (because I want to keep the Node stuff private). My understanding 头文件中发现的设置类似,任何私有结构都是在实现时定义的(即在 .c 文件中)。这是正确的方法吗?我的 LinkedList.c 文件中有一个 initializeList 函数,我将大小初始化为 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 我收到以下错误

Storage size of 'list1' is not known

我不认为在 header 中执行 typedef,然后在 .c 文件中定义结构是个好主意。
想象一下另一个文件想要使用这个结构。然后你需要重新re-type这个结构。
最后,这就是 header 个文件的重点。他们只是 copy-pastes.
因此,如果您只需要一个文件中的结构,请在该文件中定义结构。如果多个文件需要此结构,请在 header 中定义结构并将其包含在两个文件中。

要点是保持 Node 声明的私密性:因此放入 LinkedList.h 这个声明:

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

会公开声明 LinkedListType,但不会公开声明 NodeType。尽管如此,这个 header 声明 NodeType(和 struct Node)确实存在。

然后将Node类型的实际声明放在LinkedList.c文件中。

现在,您可以从任何其他翻译单元访问 LikedList 实例,也可以访问 NodeType 指针字段,但由于您不知道实际定义,因此永远不要取消引用它。

另请注意,当您创建主要可执行文件时,您会错过之前使用 'gcc -c' 选项创建的 LinkedList object 文件的链接。无论如何,我建议创建一个库并将其交付给链接列表的客户(而不是 object 文件)。

更新: 正如评论中所指出的那样,最好的做法是隐藏链表的实现细节,而不仅仅是您在问题中提到的 Node 类型。 请创建一个链接列表库,公开接受和 returns 指向 LinkedListType* 的指针的函数。并让您的客户只处理指向 LinkedListType 的指针。这就是所谓的不透明指针:你知道它存在,但你不能解引用它,因为你不知道它的定义。