为什么我会得到一个“a”;“重复符号”;我的函数在C中出错?

为什么我会得到一个“a”;“重复符号”;我的函数在C中出错?,c,gcc,C,Gcc,我有三个C文件,main.C,function1.C,和function2.C。我使用gcc-o main.c function1.c function2.c编译它们。我在function1.c中定义了一个helper函数helper()。所以function1.c看起来像这样: void helper(); void function() { ... } void helper() { ... } 但是,当我尝试在function2.c中以相同的方式定义helper()时,它给出了错误“

我有三个C文件,
main.C
function1.C
,和
function2.C
。我使用
gcc-o main.c function1.c function2.c
编译它们。我在
function1.c
中定义了一个helper函数
helper()。所以
function1.c
看起来像这样:

void helper();

void function() {
...
}

void helper() {
...
}

但是,当我尝试在
function2.c
中以相同的方式定义
helper()
时,它给出了错误“
重复符号'\u helper'
”。我假设这是因为我已经将
function1.c
function2.c
编译在一起,所以
function2.c
知道
function1.c
中的
helper()
的定义,但我不能调用
function2.c
中的
helper()
。我也不想在自己的文件中定义
helper()
,因为我可能会编写许多这样的helper文件。理想的情况是,如果我有一个
helper.c
文件,其中包含函数
helper1()
helper2()
等,所有这些函数都可以从
function1.c
function2.c
访问。有人知道怎么做吗,或者有更好的替代方法吗?

没有必要实现相同的功能两次

只需在
function1.c

function2.c
中,只需声明它而无需实现

extern void helper();

static
关键字添加到函数声明和定义中,以将函数的范围限制在文件中。如果没有
static
关键字,函数标识符位于全局命名空间中。这确实解决了问题,谢谢!你知道我如何把所有的助手函数放在一个方法中,这样我就不必在每个文件中重新声明它们了吗?C没有方法,它只有函数。但是为了解释最初的问题,在多个源文件中使用相同的函数名不会影响编译,而是会影响链接。将多个对象文件链接在一起时,将解析所有全局名称。这就是如何从一个文件中的函数调用另一个文件中的函数。添加
static
关键字会使函数成为文件的本地函数,因此不能直接从文件外部调用它,但与其他文件链接时也不会产生名称冲突。
extern
用于变量,而不是函数。函数将被声明为
void helper(void)。注意,
void
作为参数告诉编译器不能传入任何参数。理想情况下,您应该将该声明放在头文件中,并将该头文件导入定义函数的文件(实现)和使用该函数的所有文件。@CrisLuengo错了,它可以同时用于这两个文件
extern
也经常用于函数,请参见技术上您可以将
extern
添加到函数中,但默认情况下函数范围是全局的,因此没有意义。这只是噪音,所以最好不要说了。@CrisLuengo我知道这不会改变行为,但我个人和其他很多人都这么做,以便通过即时查看不同文件中实现了哪些函数来更好地了解情况
extern void helper();