2010-06-23 34 views
9

我有一个小项目,我在两个不同的源文件中命名了两个相同的名称函数,但是当我构建项目时,编译器失败,'func_name已经在filename.obj中定义了'。如何处理C中的重复函数名?

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

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

+0

这就是为什么我总是使用真正有意义的变量和函数名称。如果这两个功能完全相同,那么你就不需要其中的一个。如果他们做的是不同的事情,那么给每一个有意义的名字反映它的作用。谁必须维护你的代码将会感谢你。有机会,那将是你。 – Mawg 2014-05-05 02:31:50

回答

28

在C语言中,函数默认全局范围。要限制其范围,请使用static关键字使其对模块保密。

头文件的作用只是公布该函数及其签名到其他模块。

所有全球名称必须(有一些注意事项)是唯一的。这是有道理的,因为链接器使用该名称来连接函数调用和函数本身的实现。

具有静态和局部范围的名称只需在其范围内是唯一的。

+7

建议:将每个功能标记为“静态”。它还将使编译器的优化器更容易,例如选择内联函数和类似的函数。 – u0b34a0f6ae 2010-06-23 02:17:48

2

优雅的解决方案是在C++中引入的名称空间。解决方案,如果对func_name的调用很少,则取一个,重命名并重新编译。

东西hackerous但快速的解决方案可能是这样的:

//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 
+4

声明静态是RBerteig建议的最佳解决方案。我留下我的答案,希望这对某个人来说可能是有帮助的。 – user347594 2010-06-23 01:54:05

+0

它对我遇到的类似问题很有帮助。谢谢。 – FilipeCanatto 2017-12-27 13:12:29

4

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

5

Why could not I have two function with the same name in two differenct source file?

监守linker需要知道,当你引用它,其意思。

Imagaien表示a.hb.h都宣称my_function()。编译器为两者生成代码。现在,想象一下c.c调用my_function() - 链接器如何知道函数的两个版本中的哪一个应该被调用?

5

在头文件或源文件中是否声明了某些东西对编译器来说绝对没有区别。事实上,由于头文件通过所谓的预处理器嵌入到源文件中,所以编译器本身对任何“头文件”一无所知,它在编译器正确之前完成了它的工作。当源文件(带有嵌入的头文件)到达实际的编译器时,没有办法知道最初有什么以及头文件中插入了什么。包含所有头文件的源文件被称为翻译单元。即编译器本身适用于翻译单元,而不是一些“源”或“头”文件。

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

如果您想对单个翻译单元进行局部功能(或对象),则必须采取一些明确的步骤。你必须声明它为static。声明它为静态会给它内部链接,这基本上意味着它成为其翻译单元的内部。

声明你的函数static只有在它们都必须是本地的翻译单元时才有效。如果不是这种情况,即至少其中一个功能应该是全局可访问(可链接)功能,那么除了重命名其中一个功能外,别无选择。