我在赛普拉斯PSoC IDE(C99 ARM_GCC)中编码 . 当我在两个 *.c 模块中使用具有相同名称的函数时(例如 void MyClear() ),我得到错误:
*.c
void MyClear()
构建错误:“清除”的多重定义
MyClear() 在任何 Headers 中都没有提到,我推测它是 .C 文件的私有,但我显然是错的 .
MyClear()
.C
Point 1:
在 C 中,函数是全局 by default .
C
C 中没有 private 的概念 . 但是,有 static ,它将功能的范围仅限于翻译单元 . 有关澄清,请参阅this previous question and the answers .
private
static
Point 2
在链接状态中出现此错误 . 当所有翻译单元都已编译并即将链接在一起时,链接器可以看到该函数的多个定义,从而抛出错误 .
注意:您没有在头文件中定义函数 . 你声明它们,只要声明不冲突,你甚至可以在一个翻译单元内有任意数量的声明 .
如果没有使用 static 定义,函数是公共的(意味着它们的名称会暴露给链接器) .
函数在C中不能是私有的 . 尝试用static定义它
你链接这两个文件来创建一个可执行的二进制文件不是吗?因此,不能有重复的函数定义 .
编译器将函数名称(符号)解析为可执行二进制文件中的唯一地址 . 如果它看到两个定义,那么在运行期间调用函数时,它有一个选择的难题,执行可以跳转到一个位置并且需要预先确定 . 因为这样的编译器对多个定义不满意 .
为了克服你可以使用 static 与该功能 .
这是c中static的最佳答案 .
5 回答
Point 1:
在
C
中,函数是全局 by default .C
中没有private
的概念 . 但是,有static
,它将功能的范围仅限于翻译单元 . 有关澄清,请参阅this previous question and the answers .Point 2
在链接状态中出现此错误 . 当所有翻译单元都已编译并即将链接在一起时,链接器可以看到该函数的多个定义,从而抛出错误 .
注意:您没有在头文件中定义函数 . 你声明它们,只要声明不冲突,你甚至可以在一个翻译单元内有任意数量的声明 .
如果没有使用
static
定义,函数是公共的(意味着它们的名称会暴露给链接器) .函数在C中不能是私有的 . 尝试用static定义它
你链接这两个文件来创建一个可执行的二进制文件不是吗?因此,不能有重复的函数定义 .
编译器将函数名称(符号)解析为可执行二进制文件中的唯一地址 . 如果它看到两个定义,那么在运行期间调用函数时,它有一个选择的难题,执行可以跳转到一个位置并且需要预先确定 . 因为这样的编译器对多个定义不满意 .
为了克服你可以使用
static
与该功能 .这是c中static的最佳答案 .