使用DOSBox版本0.74在C中出现多个声明错误

时间:2014-11-27 06:33:40

标签: c data-structures

我在DOSBox版本0.74,Double Linked List上创建一个简单的项目。 我创建了3个文件:

  • 头文件DLinkedList.h包含列表节点和函数原型的结构。
  • DLinkedList.c文件。包含这些功能的实现。
  • main.c文件

头文件包含在其他两个文件中。 并且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;

2 个答案:

答案 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将无法查看功能。