我在一个项目中使用EclipseIndigo、gcc和cdt。如果独立源文件中的两个函数共享名称(无论返回类型或参数如何),eclipse将标记重新定义错误。对于这个项目来说,这不是一个大问题,因为我可以很容易地重命名这些函数,而且我很清楚包装器(如果是的话)。虽然这不是一个关键的问题,但它确实让我觉得我不理解c构建过程。在这样的程序结构会导致问题的生成过程中会发生什么?
这里有更多的信息。在这种情况下,以及我的理解到目前为止——不必回答这个问题,尽管我的理解一定有漏洞。
在这种情况下,这两个函数只在本地使用,因此它们的原型没有在.h接口中给出,为了我的观点,也没有定义为“static”。
这些源文件都没有包含在项目的任何位置,因此它们不应该共享任何编译单元。考虑到这一点,我会假设这两个源文件都不知道另一个源文件的存在,编译器将不会对两个函数进行索引,因为单独的文件将允许在链接过程中正确地区分这两个文件——只要它们不包含在同一编译单元中。
我注意到静态地定义函数声明的任何一个实例都可以消除错误。我记得在某个时候读到过,每个未声明为静态的函数都是全局的——尽管这些函数不是.h接口的一部分,但在包含.h接口的实际示例中,include程序不允许引用所有.c函数,这表明“隐藏”这些函数是没有问题的。
我忽略了什么?
有见识者不胜感激,谢谢!
最佳答案
这就是“联系”的概念。C中的每个函数和变量都有一个链接类型,即“外部”、“内部”和“无”。(只有变量才能没有链接。)
默认情况下,函数具有外部链接,这意味着它们可以从任何编译单元(其中“compilation unit”大致是指一个源文件及其包含的所有头文件)按名称调用。这可以通过声明它们来显式表示,也可以通过声明它们来重写。声明的函数具有内部链接,这意味着它们只能从同一编译单元中的其他函数按名称引用。
无论头文件如何,同一程序中任何地方的两个外部函数都不能具有相同的名称,但不同编译单元中的静态函数可能具有相同的名称。静态函数的名称也可能与外部函数的名称相同——然后该名称解析为其编译单元中的静态函数,以及其他位置的外部函数。这些限制是有意义的,否则函数调用可能是不明确的。
头文件根本不包含在链接公式中。它们主要是共享声明的工具,但函数的链接只取决于如何声明,而不取决于在哪里声明。
我将关于变量关联的讨论留到下一次。
关于c - 如果同一工作空间中的两个单独的源文件共享函数名称,为什么C不能编译?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/32362237/