为什么两个 .C 文件中的同名私有函数会导致多重定义错误?

Why does the same named private function inside two .C files cause a multiple definition error?

我正在赛普拉斯 PSoC IDE (C99 ARM_GCC) 中编码。当我在两个 *.c 模块(例如 void MyClear())中使用同名函数时,出现错误:

Build error: multiple definition of `Clear'

MyClear() 未在任何 header 中提及,我认为它是 .C 文件的私有文件,但我显然错了。

您正在链接这两个文件以创建一个可执行二进制文件,不是吗?因此不能有函数的重复定义。

编译器会将函数名称(符号)解析为可执行二进制文件中的唯一地址。如果它看到两个定义,在 运行 期间调用函数时,它有一个进退两难的选择,执行可以跳转到一个位置,需要预先确定。因此,编译器对多个定义不满意。

第 1 点:

C中,函数是全局的默认

C中没有private的概念。 FWIW,有 static,但是,将函数的范围 限制为仅翻译单元。有关说明,请参阅 this previous question and the answers

点 2

您在链接状态中遇到此错误。当所有翻译单元都已编译并即将链接在一起时,链接器可以看到函数的多个定义并因此抛出错误。

注意事项:您没有在头文件中定义函数。您 声明 它们,只要声明不冲突,即使在一个翻译单元中也可以有任意数量的声明。

函数是 public(意思是它们的名字暴露给链接器)如果没有用 static.

定义

C 中的函数不能是私有的。尝试用 static

定义它

要克服这个问题,您可以使用 static 和该功能。

这里是 c.

static 的最佳答案