如何处理C中重复的函数名?

如何处理C中重复的函数名?,c,naming-conventions,C,Naming Conventions,我有一个小项目,在其中我在两个不同的源文件中命名了两个同名函数,但在我构建项目时,编译器失败了,因为“func_name已经在filename.obj中定义” 为什么我不能在两个不同的源文件中有两个同名的函数?我认为该函数应该是源文件的本地函数,只有当我们在头文件中声明它时,它才会变为全局函数 除了更改文件名外,C语言中是否有其他的复制函数名的优雅解决方案?< P>优雅的解决方案是C++中引入的命名空间。解决方案是,如果对func_name的调用很少,则使用take one,重命名它并重新编译

我有一个小项目,在其中我在两个不同的源文件中命名了两个同名函数,但在我构建项目时,编译器失败了,因为“func_name已经在filename.obj中定义”

为什么我不能在两个不同的源文件中有两个同名的函数?我认为该函数应该是源文件的本地函数,只有当我们在头文件中声明它时,它才会变为全局函数


除了更改文件名外,C语言中是否有其他的复制函数名的优雅解决方案?

< P>优雅的解决方案是C++中引入的命名空间。解决方案是,如果对func_name的调用很少,则使用take one,重命名它并重新编译

一些骇客但快速的解决方案可能是:

//In one of the two source files and any file that calls it

//if your functions is something like this
//void func_name(int) { ... }
//Add the following line
#define func_name SOME_UNIQUE_FUNC_NAME

在C语言中,函数默认具有全局作用域。要限制其范围,请使用
static
关键字将其设置为模块的私有

头文件的作用只是将函数及其签名公布给其他模块

所有全局名称都必须(有一些警告)是唯一的。这是有意义的,因为链接器使用该名称将函数调用连接到函数本身的实现


具有静态和本地作用域的名称只需在其作用域内唯一

声明函数
static
,使其成为文件的本地函数。在C语言中,每个标识符名称都必须是唯一的

为什么我不能在两个不同的源文件中有两个同名的函数

因为链接器需要知道引用它时的含义


假设
a.h
b.h
都声明
my\u函数()。编译器为两者生成代码。现在,假设
c.c
调用
my_function()
-链接器如何知道应该调用函数的两个版本中的哪一个?

头文件或源文件中声明的内容对编译器来说绝对没有区别。事实上,编译器本身对任何“头文件”都一无所知,因为头文件是由所谓的预处理器嵌入到源文件中的,预处理器在编译器本身之前完成其工作。当源文件(带有嵌入的头文件)到达实际的编译器时,没有办法知道最初有什么以及从头文件插入了什么。嵌入了所有头文件的源文件称为翻译单元。也就是说,编译器本身使用翻译单元,而不是某些“源”或“头”文件

在C语言中,默认情况下,在文件范围内声明的所有对象和函数都具有外部链接,这意味着它们是全局的,对于整个程序是唯一的。所以,你想得不对。函数不只是一个源文件的本地函数

如果要使函数(或对象)成为单个转换单元的局部函数,则必须采取一些明确的步骤。您必须将其声明为
静态
。将其声明为静态将给它提供内部链接,这本质上意味着它成为其翻译单元的内部


只有当两个函数都必须是各自翻译单元的本地函数时,才能将它们声明为静态函数。如果情况并非如此,即如果至少有一个函数应为全局可访问(可链接)函数,则您别无选择,只能重命名其中一个函数。

声明静态是RBerteig建议的最佳解决方案。我留下我的答案,希望它能对某人有所帮助。它对我所面临的类似问题是有帮助的。谢谢。建议:将每个函数都标记为
静态
。这也使得编译器的优化器更容易选择内联函数和类似的函数。这就是为什么我总是为变量和函数使用真正有意义的名称。如果这两个函数做的是完全相同的事情,那么您不需要它们中的任何一个。如果他们在做不同的事情,那么给每个人一个有意义的名字,以反映他们所做的事情。任何需要维护您的代码的人都会感谢您。很可能就是你。