我在DOSBox版本0.74,Double Linked List上创建一个简单的项目。 我创建了3个文件:
头文件包含在其他两个文件中。
并且DLinkedList.c
也包含在main.c
中,通常我不会这样做,但DOSBox表示DLinkedList.c
中的函数未在main()
中定义。当我将.c
文件包含在main.c
中时解决了这些错误。
现在我的问题是我收到此错误
ERROR DLinkedList.h multiple declaration of listnode
除了原型之外,这是头文件中的代码。
typedef struct listnode{
int id;
char name[SIZE];
struct listnode *next;
struct listnode *prev;
}ListNode;
typedef struct list{
ListNode *head;
int size;
}List;
答案 0 :(得分:4)
,DLinkedList.c也包含在main.c中。
您不会在其他C文件中包含C文件。
接受的做法是创建一个包含声明(而不是定义)的标题文件,然后包含该文件。
可能发生的事情是,您在main.c
中再次包含头文件两次,并在DLinkedList.c
中再次包含头文件 1}}。
因此,例如,如果您的main.c
文件是:
DLinkedList.c
然后等效的int getFortyTwo (void) { return 42; }
文件将具有原型:
DLinkedList.h
我能想到的唯一情况是你可能认为你需要包含C文件,如果你自己完全编译/链接int getFortyTwo (void);
,那就不是这样做的方法。
您将编译 main.c
,将其他C文件编译到单个目标文件中,然后链接这两个文件。
答案 1 :(得分:3)
您需要的是一个标题保护[a.k.a include guard]来解决multiple declaration
问题。
以这种方式重写您的头文件
#ifndef __MY_HEADER_
#define __MY_HEADER_
//header file containts
#endif
然后您可以将它包括在您想要的次数中。这个标题保护只能确保一次出现头文件定义。
此外,请确保不要#include
.c
个文件。有.h
个文件用作头文件,存在两种不同的类型。
然后,此处显示的代码段存在一些问题。除非使用初始化程序,否则无法使用char name[];
。指定数组的维数,如char name[64];
最后,关于main.c
中缺少的定义,您需要将forward declatation
中定义的函数的函数原型[哪些服务器作为DLinkedList.c
]添加到头文件中,将被包括在main.c
中。否则,您的main.c
将无法查看功能。