为什么两个 .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 的最佳答案
我正在赛普拉斯 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 的最佳答案