在实际工作中,一个产品的代码是很复杂的,不可能由一个人全部编写,由此就得分成多个模块,每个人只负责其中一个模块的代码编写。模块之间先定义好通信的协议,也就是交互的函数接口。程序员只需要根据协议去实现具体的函数功能,通信协议只是规定了逻辑上的功能,具体的实现是程序员完成,且编写各个模块代码的程序员之间都互相不清楚对方是如何实现的。这种情况下就可能存在函数重名问题,也就是两个库之间有函数的名字一样,链接的时候编译器不知道该链接哪一份代码,会报重复定义的错误。
在C语言中是不能重名的,但是在C++中是可以重名的,C++有函数重载机制,可以解决掉函数重名问题。这里以C语言的角度来讨论。程序最终都是要在内存中运行的,由于虚拟地址的映射功能,每个进程都认为自己独享整个内存,在链接的时候会根据链接脚本来链接程序。每个函数都会存放在一段内存中,而函数名就是函数指针,指向存放函数的内存首地址。如果有两个函数重名,那就会有两块内存分别存放了两个函数的代码,但是他们都共用一个函数名,即一个函数名要映射到两个地址,这是不允许的。可以有多个指针指向同一个地址,但是不能允许一个指针变量指向多个地址。
1.在源文件中,不对外提供的函数,定义时都用static修饰,将该函数的链接属性限定在本文件; 2.函数命名时,在每个函数的名字前都加上库的名称,一般库的名字是唯一且不重合的; 3.全局变量如果只在本文件中使用,最好也使用static修饰;
给大家推荐一款嵌入式工程师的学习神器,里面包含C语言、linux、操作系统等嵌入式工程师必备的知识点,不仅可以学习知识点还有配套的练习题、大厂面试题。博主在入门嵌入式行业时也是在这个平台学习,如果你是想入门嵌入式或者是找工作,都强烈推荐你使用这个网站。 《学习神器点这里》