什么是函数重名问题?

在实际工作中,一个产品的代码是很复杂的,不可能由一个人全部编写,由此就得分成多个模块,每个人只负责其中一个模块的代码编写。模块之间先定义好通信的协议,也就是交互的函数接口。程序员只需要根据协议去实现具体的函数功能,通信协议只是规定了逻辑上的功能,具体的实现是程序员完成,且编写各个模块代码的程序员之间都互相不清楚对方是如何实现的。这种情况下就可能存在函数重名问题,也就是两个库之间有函数的名字一样,链接的时候编译器不知道该链接哪一份代码,会报重复定义的错误。

为什么不能重名?

在C语言中是不能重名的,但是在C++中是可以重名的,C++有函数重载机制,可以解决掉函数重名问题。这里以C语言的角度来讨论。程序最终都是要在内存中运行的,由于虚拟地址的映射功能,每个进程都认为自己独享整个内存,在链接的时候会根据链接脚本来链接程序。每个函数都会存放在一段内存中,而函数名就是函数指针,指向存放函数的内存首地址。如果有两个函数重名,那就会有两块内存分别存放了两个函数的代码,但是他们都共用一个函数名,即一个函数名要映射到两个地址,这是不允许的。可以有多个指针指向同一个地址,但是不能允许一个指针变量指向多个地址。

避免函数重名的方法:

1.在源文件中,不对外提供的函数,定义时都用static修饰,将该函数的链接属性限定在本文件;
2.函数命名时,在每个函数的名字前都加上库的名称,一般库的名字是唯一且不重合的;
3.全局变量如果只在本文件中使用,最好也使用static修饰;

给大家推荐一款嵌入式工程师的学习神器,里面包含C语言、linux、操作系统等嵌入式工程师必备的知识点,不仅可以学习知识点还有配套的练习题、大厂面试题。博主在入门嵌入式行业时也是在这个平台学习,如果你是想入门嵌入式或者是找工作,都强烈推荐你使用这个网站。
《学习神器点这里》
在这里插入图片描述
在这里插入图片描述

代码如下:#include <stdio> void f() { printf(“function\n”); }#define f() printf(“macro\n”) int main() {  f(); // macro  (f)(); // function   return 0;} 函数 名加括号即可! 您可能感兴趣的文章:详解 C语言 的#define宏定义命令用法简单讲解 C语言 宏的定义与使用如何在 C语言 的宏 使用类型关键字 C语言 的内联 函数 (inline)与宏定义(#define)详细解析 C语言 宏定义使用的小细节 C语言 宏定义使用
问题 :linux下程序链接动态c库总是失败,提示库 的几个 函数 出现 问题 。苦找无果,最后发现原因——库内两个c 函数 重名 。 结论:最好不要 重名 ,但可以通过一些限制避免这个 问题 。 提问: c语言 可以 函数 重载吗? answer:可以实现。我参考了几种说法。 1, c语言 不支持 函数 重载。同一作用区域不可以有 函数 重名 ,但不同作用区域 允许 函数 重名 。不同作用区域可以通过在不同文件 使用static实现。...
最近某个程序需要调用多个动态库,但是不同的动态库 使用了功能不同的 同名 函数 ,导致调用出现偏差,可参考以下 解决 办法。 假设有动态库libFuncA.so和libFuncB.so,他们的内部实现分别为: /*func_A.c*/ #include<stdio.h> //内部 函数 int sayHi() printf("Hi,this is AAAAA\n"); return 0; //外部调用 函数 int sayOut() sayHi();
最近当遇到一个奇怪的 问题 ,程序 编译 运行不报错,但是执行结果却一直不是自己预期的结果,定位时发现 问题 出现在 重名 函数 处,自定义的C接口与另一方提供的动态库 的一个接口名冲突了,导致程序在链接时一直找的是自己定义的接口,这块好改,改一下接口名即可; 但是后来发现不管定义的接口是不是static或者接口参数并不一致,甚至没有任何其它文件引用该接口所在到的文件,仅仅放到项目 编译 能通过,运行就有 问题 ,执行...
(1) 对于初始化的全局变量,碰到之后就知道这是一个定义,会马上分配空间, (2) 对于没有初始化的全局变量,因为不知道是定义还是声明,所以要在扫描完所有代码之后才能决定,这个时候 编译 器会读符号表,然后看哪些变量没有分配空间.   指针是C/C++语言的特色,而数组名与指针有太多的相似,甚至很多时候,数组名可以作为指针使用。于是乎,很多程序设计者被搞糊涂了。而许多的大学老师,他们在 C语言 的教学过程 也错误得给学生讲解:"数组名是指针"。很幸运,我的大学老师是其 之一。时至,我日复一日地进行着C/C++项目的开发,而身边还一直充满这样的程序员,他们保留着"数组名是指针"的误解。   想必这种误解的根源在于国内某的C程序设计教程。如果这篇文章能够纠正许多 国程序员对数组名和指针的误解,笔者不甚欣慰了。借此文,笔者站在无数对知识如饥似渴的 国程序员之 ,深深寄希望于国内的计算机图书编写者们,能以"深入探索"的思维
第1章 C语言 本章主要描述 C语言 一些基本要素。当你开始编写C程序时,你可能对 C语言 的一些基本 问题 感到困惑,如 C语言 所使用的约定、关键字和术语等。本章将回答这方面你经常会遇到的一些 问题 。 例如,switch语句是最常用的一种 C语言 构件,本章将回答与它有关的三个常见 问题 。本章还涉及其它几个 问题 ,如循环、分支、运算符的优先级和程序块技术。在阅读本章时,请注意有关switch语句和运算符优先级的一些 问题 ,这些 问题 常常会使 C语言 的初学者感到迷惑。 1.1 什么是局部程序块(local block)? 局部程序块是指一对大括号({})之间的一段 C语言 程序。一个C 函数 包含一对大括号,这对大括号之间的所有内容都包含在一个局部程序块 。if语句和swich语句也可以包含一对大括号,每对大括号之间的代码也属于一个局部程序块。此外,你完全可以创建你自己的局部程序块,而不使用C 函数 或基本的C语句。你可以在局部程序块 说明一些变量,这种变量被称为局部变量,它们只能在局部程序块的开始部分说明,并且只在说明它的局部程序块 有效。如果局部变量与局部程序块以外的变量 重名 ,则前者
C++ 静态成员 函数 与静态成员变量(static ) 这篇介绍了静态成员 函数 与静态成员变量,是我的读书笔记,我希望它够简短但又比较全面,起到复习的作用。如果有一些C++知识记不清楚了,它可以帮你很快回忆起来。 复习 C语言 的static关键字 (1)加在局部变量的前面使之成为静态局部变量,作用域还是在 函数 内部,可是生存周期延长了。 (2)加在全局变量的前面限定该变量作用域为文件作用域,就是说即使其他文件使用了extern扩展作用域也不行。这在 C语言 的多人项目 非常有用,避免了变量的 重名 。然而在C++ 这一功能已经被命名空间取代,但是为了保持和 C语言 的兼容,static还是有这样的功能。
1、局部变量能否和全局变量 重名 ? 答:能,局部会屏蔽全局。要用全局变量,需要使用”::” 局部变量可以与全局变量 同名 ,在 函数 内引用这个变量时,会用到 同名 的局部变量,而不会用到全局变量。对于有些 编译 器而言,在同一个 函数 内可以定义多个 同名 的局部变量,比如在两个循环体内都定义一个 同名 的局部变量,而那个局部变量的作用域就在那个循环体内。 2、如何引用一个已经定义过的全局变量? 答:extern 可以用引用头文件的方式,也可以用extern关键字,如果用引用头文件方式来引用某个在头文件 声明的全局变理,假定你将那个变写错了,那么在 编译 期间会报错,如果你用extern方式引用时,假定你犯了同样的错误,那么
2.在同一源文件 多次定义 同名 宏,则宏为最后一次定义的值。 一般第1种情况不会出现什么 问题 ,因为该宏仅仅在自己的.c文件 被使用,但是第2种情况,若某个.c文件包含了2个头文件,这2个头文件都定义了 同名 的宏,那么这个.c文件将认最后一次包含定义的宏,这样可能并不是我们想要的结果。由于有时候头文件是层层嵌套包含的,一旦出现 问题 很难查到原因。 example1.h #define MAX 10 exam...