0

我遇到了一个经典错误,但仍然不明白为什么会发生...

下面是简化的解释显然我有两个 C 文件 main.c 和 support.c

在 support.ci 中有一个函数 void bla(int input);

在 main.ci 中使用 support.c 中的 bla 有几个功能,我包括

#include<support.c> 

在 main.c 的顶部

但是我无法编译项目,因为bla的错误多重定义,首先定义在这里(eclipse指向support.c中bla的定义)

我知道最好我必须创建头文件 support.h 并在那里提供原型 extern void bla(int input) ,但为此我必须包含 .c 文件。

提前致谢。

4

3 回答 3

2

您不会将源文件包含到其他源文件中。.h相反,您制作一个包含函数声明的头文件(带有扩展名) ,即函数原型。然后,您分别构建两个源文件,并将它们链接在一起以形成最终的可执行文件。

support.h所以像这样的头文件

#ifndef SUPPORT_H
#define SUPPORT_H

void blah(void);

#endif

(预处理器#ifdef//的东西用于包含保护#define,以防止在同一源文件中多次包含。)#endif

然后是support.c源文件

#include "support.h"

void blah(void)
{
    /* Some code here... */
}

最后是main.c源文件

#include "support.h"

int main(void)
{
    blah();
    return 0;
}

如果您有 IDE(如 Visual Studio),并且将这些文件添加到项目中,则 IDE 将确保所有内容均已正确构建和链接。如果您在命令行上编译,请将每个源文件编译成一个目标文件(通常使用类似-c(用于 GCC 和 clang)之类的选项),然后将两个目标文件链接在一起以创建可执行文件。


使用 GCC 的命令行示例:

$ gcc -Wall -c main.c -o main.o
$ gcc -Wall -c support.c -o support.o
$ gcc main.o support.o -o my_program

上面三个命令会先把源文件编译成目标文件,然后链接在一起。

于 2013-11-04T07:06:26.207 回答
2

预处理器将复制 的内容support.c,并将其粘贴main.c到替换行#include<support.c>。所以函数的定义有两种bla,一种是in support.c,一种是in main.c

解决方案是,不要包含源文件。将要导出的函数声明support.h放在头文件中,并将头文件包含在main.c

#include "support.h"
于 2013-11-04T07:04:03.337 回答
1

你用的是什么编译器?

编译时,请确保执行以下操作:

gcc main.c support.c -o yourProgram
于 2018-10-26T12:21:26.613 回答