什么是函数重名问题?
在实际工作中,一个产品的代码是很复杂的,不可能由一个人全部编写,由此就得分成多个模块,每个人只负责其中一个模块的代码编写。模块之间先定义好通信的协议,也就是交互的函数接口。程序员只需要根据协议去实现具体的函数功能,通信协议只是规定了逻辑上的功能,具体的实现是程序员完成,且编写各个模块代码的程序员之间都互相不清楚对方是如何实现的。这种情况下就可能存在函数重名问题,也就是两个库之间有函数的名字一样,链接的时候编译器不知道该链接哪一份代码,会报重复定义的错误。
为什么不能重名?
在C语言中是不能重名的,但是在C++中是可以重名的,C++有函数重载机制,可以解决掉函数重名问题。这里以C语言的角度来讨论。程序最终都是要在内存中运行的,由于虚拟地址的映射功能,每个进程都认为自己独享整个内存,在链接的时候会根据链接脚本来链接程序。每个函数都会存放在一段内存中,而函数名就是函数指针,指向存放函数的内存首地址。如果有两个函数重名,那就会有两块内存分别存放了两个函数的代码,但是他们都共用一个函数名,即一个函数名要映射到两个地址,这是不允许的。可以有多个指针指向同一个地址,但是不能允许一个指针变量指向多个地址。
避免函数重名的方法:
1.在源文件中,不对外提供的函数,定义时都用static修饰,将该函数的链接属性限定在本文件;
2.函数命名时,在每个函数的名字前都加上库的名称,一般库的名字是唯一且不重合的;
3.全局变量如果只在本文件中使用,最好也使用static修饰;