首页 文章

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

提问于
浏览
1

我在赛普拉斯PSoC IDE(C99 ARM_GCC)中编码 . 当我在两个 *.c 模块中使用具有相同名称的函数时(例如 void MyClear() ),我得到错误:

构建错误:“清除”的多重定义

MyClear() 在任何 Headers 中都没有提到,我推测它是 .C 文件的私有,但我显然是错的 .

5 回答

  • 4

    Point 1:

    C 中,函数是全局 by default .

    C 中没有 private 的概念 . 但是,有 static ,它将功能的范围仅限于翻译单元 . 有关澄清,请参阅this previous question and the answers .

    Point 2

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

    注意:您没有在头文件中定义函数 . 你声明它们,只要声明不冲突,你甚至可以在一个翻译单元内有任意数量的声明 .

  • 0

    如果没有使用 static 定义,函数是公共的(意味着它们的名称会暴露给链接器) .

  • 4

    函数在C中不能是私有的 . 尝试用static定义它

  • 0

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

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

  • 2

    为了克服你可以使用 static 与该功能 .

    这是c中static的最佳答案 .

相关问题