我在 Cypress PSoC IDE (C99 ARM_GCC) 中编码。*.c
当我在两个模块(例如)中使用同名函数时,void MyClear()
我收到错误:
构建错误:“清除”的多个定义
MyClear()
在任何标题中都没有提到,我认为它是.C
文件私有的,但我显然错了。
第 1 点:
在C
中,函数默认是全局的。
没有private
in 的概念C
。static
但是,FWIW将函数的范围限制为仅翻译单元。请参阅this previous question和答案以获得一些澄清。
第 2 点
您在链接状态下收到此错误。当所有翻译单元都已编译并即将链接在一起时,链接器可以看到多个函数定义并因此引发错误。
注意事项:您不在头文件中定义函数。您声明它们,只要声明不冲突,即使在单个翻译单元内也可以有任意数量的声明。
如果未使用static
.
函数在 C 中不能是私有的。尝试用静态定义它
您正在链接这两个文件以创建一个可执行二进制文件,不是吗?因此不能有重复的函数定义。
编译器会将函数名称(符号)解析为可执行二进制文件中的唯一地址。如果它看到两个定义,它在运行期间调用函数时会选择哪一个,执行可以跳转到一个需要预先确定的位置。因此,编译器对多个定义不满意。
要克服,您可以使用 static
该功能。
这是c中静态内容的最佳答案。