C中的多重定义

时间:2013-12-06 20:50:39

标签: c eclipse

我有一个用C语言编写的项目,包括FIFO.h,FIFO.c,task.h,task.c和main.c(它是一个基本队列)。 当我在Windows下使用gcc编译我的main.c时,它编译并正常工作。但是,当我尝试在Eclipse中编译完全相同的代码时,每个函数都会出现以下错误:

一个例子是:

In function `queue_new':
FIFO\Debug/../src/QueueFIFO.c:20: multiple definition of `queue_new'
src\main.o:FIFO\Debug/../src/QueueFIFO.c:20: first defined here
src\FIFO.o:

老实说,我不知道你们可以使用哪些其他信息,所以请告诉我该怎么做。

main.c包括:

#include "FIFO.h"
#include "FIFO.c"
#include "task.h"

QueueFIFO.c:

#include "task.h"

FIFO.c:

#include "task.h"
#include "QueueFIFO.c"

task.c:

#include "task.h"

1 个答案:

答案 0 :(得分:1)

您收到多个定义错误,因为您在.c个文件中包含了.c个文件。这是链接器的工作,以确保它们聚集在一起。好的做法是只在.h文件中包含.c个文件,并确保.h文件不包含函数定义(仅限函数原型)。

通过#include .c个文件,您至少要定义两次函数:编译FIFO.c时一次,main.c#include FIFO.c编译时将queue_new()逐字复制到编译前的文本中。当谈到链接时间时,链接器会看到例如FIFO.omain.o以及FIFO.c中所有函数的多重定义barf中定义的#include

此外,正如其他人所提到的,请确保您“保护”您的头文件,以确保它们不会创建循环#ifndef依赖项。您可以使用#define/* foo.h */ #ifndef FOO_H #define FOO_H #include "bar.h" #include "baz.h" /* header file contents go here */ #endif /* FOO_H */ 执行此操作,如下所示:

{{1}}

这具有仅执行文件内容一次的效果,因为如果第二次包含FOO_H将被定义,并且将跳过整个文件。