为什么我会得到一个“a”;“重复符号”;我的函数在C中出错?
我有三个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()时,它给出了错误“
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();