历史上的今天
返回首页

历史上的今天

今天是:2025年02月22日(星期六)

2020年02月22日 | stm32f103学习笔记——关键字extern、static、const

2020-02-22 来源:eefocus

1、extern


extern放在变量和函数声明之前,表示该变量或者函数在别的文件中已经定义,提示编译器在编译时要从别的文件中寻找。除此之外,extern还可以用来进行链接指定。


(1) 声明外部变量。在声明全局变量时,不同的文件在编译器编译时是不透明的,在A.c中定义 int i,同时在B.c中定义 int i,编译器编辑时是不会报错的,但是当链接linking...时会报错重复定义,链接是不同文件是透明的,因此在定义全局变量是不能够重复定义。当需要使用同一个全局变量时,如:在A.c中定义了int i,在B.c中需要调用i,只需要在B.c中声明extern int i,表示该变量在别的文件中已经定义,编译时便不会出错,在linking...的时候会自动去查找定义过的变量i。


(2) extern函数声明。Extern void fun() 暗示该函数可能在别的文件中定义过,它和定义为void fun(),没什么区别,其用处在于在复杂的项目用通过在函数前添加extern声明来取代利用include”*.h”来声明函数。


(3) 单方面修改函数原型。(对于这个功能我没怎么看懂,只说说自己理解,原文请参考:http://www.cnblogs.com/yc_sunniwell/archive/2010/07/14/1777431.html)。 当声明extern void fun(int i, int j,int k)时,在之后的调用中如果按照是fun(x,y,z)的原型调用时是没有问题的,但是如果要对该函数进行修改比如减少输入参数,调用时为fun(x,y)此时编译器就会报错了,解决方法就是去掉extern,该头文件中声明void fun(int i,int j),并对该函数进行修改,之后在调用的文件中包含该函数所在的头文件”*.h”即可。


(4) extern “C”。主要应用于C++环境下使用C函数,C++语言在编译的时候为了解决函数的多态问题,会将函数名和参数联合起来生成一个中间的函数名称,而C语言则不会,因此会造成链接时找不到对应函数的情况,此时C函数就需要用extern “C”进行链接指定,这告诉编译器,请保持我的名称,不要给我生成用于链接的中间函数名。


2、static


static在C++中的应用:面向过程程序设计、面向对象程序设计。


面向过程程序设计:


(1) 应用于普通变量和函数,不涉及类。当在变量前加上static如:static int a,定义了a为全局静态变量,一般全局静态变量不定义在头文件中,而是定义在源文件中,全局静态变量只对所在源文件透明,而在该文件之外是不可见的。在定义全局静态变量的时候声明和定义同时发生,即定义了static int a时就在全局变量数据区分配了内存,如果为给a赋值,则程序自动初始化为0(在函数体内声明的自动变量的值是随机的,除非它被显式初始化,而在函数体外被声明的自动变量也会被初始化为0)。


(2) 定义静态变量的好处:在其他文件中不会被引用;在不同的文件中可以出现相同的变量名。


(3) 通常,在函数体内定义了一个变量,每当程序运行到该语句时都会给该局部变量分配栈内存。但随着程序退出函数体,系统就会收回栈内存,局部变量也相应失效。


但有时候我们需要在两次调用之间对变量的值进行保存。通常的想法是定义一个全局变量来实现。但这样一来,变量已经不再属于函数本身了,不再仅受函数的控制,给程序的维护带来不便。


静态局部变量正好可以解决这个问题。静态局部变量保存在全局数据区,而不是保存在栈中,每次的值保持到下一次调用,直到下次赋新值。


静态局部变量有以下特点:


该变量在全局数据区分配内存;


静态局部变量在程序执行到该对象的声明处时被首次初始化,即以后的函数调用不再进行初始化;


静态局部变量一般在声明处初始化,如果没有显式初始化,会被程序自动初始化为0;


它始终驻留在全局数据区,直到程序运行结束。但其作用域为局部作用域,当定义它的函数或语句块结束时,其作用域随之结束。


(4) 静态函数。在函数前添加关键字static,表示该函数为静态函数,只对当前文件可见,对其他文件不可见。这样也可以在同一个项目中不同的文件定义相同的函数名,而不会出现错误。


面向对象程序设计:


(待续......)


在C语言中的应用:


   (1) 用于定义内部函数:static <函数类型>  <函数名> 表示该函数只对该文件可见,对其他文件不可见。


   (2) 声明全局静态变量:static <变量类型>  <变量名> static修饰的全局变量声明与定义同时进行,也就是说当你在头文件中使用static声明了全局变量后,它也同时被定义了;最后,static修饰全局变量的作用域只能是本身的编译单元,也就是说它的“全局”只对本编译单元有效,其他编译单元则看不到它 。


(个人认为:在c语言中的应用和在c++中面向过程程序设计的应用是一样的,本身C语言就是一种面向过程程序设计的语言。)


3、const


常类型是指使用类型修饰符const说明的类型,常类型的变量或对象的值是不能被更新的。可以避免意义模糊的数字出现,同样可以很方便地进行参数的调整和修改。 同宏定义一样,可以做到不变则已,一变都变。 可以节省空间,避免不必要的内存分配。const可以被extern修饰,但是static是不可以被extern修饰。

推荐阅读

史海拾趣

AMERICASEMI [America Semiconductor, LLC]公司的发展小趣事

为了进一步扩大市场份额,AMERICASEMI积极寻求与其他企业的合作机会。公司与多家知名电子产品制造商建立了稳定的合作关系,为其提供优质的半导体产品和技术支持。同时,AMERICASEMI还积极开拓国际市场,将产品出口到全球多个国家和地区,实现了业务的快速增长。

Carling Technologies公司的发展小趣事

为了确保产品质量和满足国际标准,Carling Technologies先后获得了多项ISO和TS认证。这些认证不仅证明了公司在质量管理方面的实力,也为其产品在全球市场上的竞争提供了有力支持。同时,公司还建立了标准化的生产流程和质量检测体系,确保每一款产品都能达到客户的期望和要求。

捷茂微(GATEMODE)公司的发展小趣事

为了确保产品质量和满足国际标准,Carling Technologies先后获得了多项ISO和TS认证。这些认证不仅证明了公司在质量管理方面的实力,也为其产品在全球市场上的竞争提供了有力支持。同时,公司还建立了标准化的生产流程和质量检测体系,确保每一款产品都能达到客户的期望和要求。

Connor-Winfield公司的发展小趣事

随着全球经济的一体化,电子行业也逐渐呈现出全球化的趋势。Connor-Winfield敏锐地把握住了这一机遇,开始实施全球化战略。公司积极拓展海外市场,与多家国际知名企业建立了紧密的合作伙伴关系。这些合作不仅为公司带来了更多的商业机会,也使其在全球化竞争中保持了领先地位。

CTC Coils Ltd公司的发展小趣事

CTC Coils Ltd公司早期以生产传统电感线圈为主,随着电子技术的飞速发展,公司意识到必须进行技术升级。于是,公司投入大量研发资源,成功开发出一种新型高效能电感线圈,该产品在性能上大幅提升,同时降低了能耗。这一技术突破使CTC Coils Ltd的产品在市场上脱颖而出,公司迅速赢得了大量客户,并扩大了生产规模。

台湾诚阳(BC)公司的发展小趣事

在追求经济效益的同时,台湾诚阳(BC)公司也积极履行企业社会责任。公司关注环保和可持续发展,致力于推广绿色电子产品和节能减排技术。同时,公司还积极参与社会公益事业,为当地社区的发展做出贡献。这种对社会责任的承担和关注,使得台湾诚阳在业界树立了良好的形象,赢得了社会各界的认可和尊重。

请注意,以上故事仅为虚构示例,并不代表台湾诚阳(BC)公司或任何真实公司的实际情况。如果您对该公司有进一步的了解需求,建议直接访问其官方网站或查阅相关新闻报道。

问答坊 | AI 解惑

一种提高无线局域网传输效率的技术

摘要:随着信息技术的快速发展,无线网络技术的应用越来越广泛,但是无线网络传输的效率一直比较低。针对这 种情况提出了一种提高无线局域网传输效率的技术。先在原理上讨论了使用包融合技术在无线局域网中使用的可 行性,然后通过在NS2 下的模拟 ...…

查看全部问答>

小白跪问 现有ARM9开发板上的RS232口怎么改成RS485的?

我的老师那里有一块开发板,其中J6接口如下图所示: 标号    名称           功能                  说明 J6   &n ...…

查看全部问答>

新手求助

大家好,本人大二,学习了模电和单片机.这个学期想参加电子设计比赛,初赛题要做一个基于fpga的频率计。我已经基本上了解了fpga的含义,但还是有一些问题想请教: 1.fpga的开发板价位从几十到几万…我看很多都是为嵌入式系统做的.如果只是要做频率 ...…

查看全部问答>

汇编高手乱入 关于十进制指令

看指令表有关与十进制指令 DADD.B 将十进制的进位位和源操作数加至目的操作数 语法 DADD.B src, dst 操作 src + dst + C -> dst (十进制) 有点不理解,大侠,斑竹指点 例如: CLRC ;复位进位位 CLR R5 DADD.B #99, R5 那 ...…

查看全部问答>

求助

I/O模拟I2C,假设P2.1接SDA,那么发送过来的8位数据放在什么地方?是P2IN吗?若是的话,8位数据是同时放在P2IN里吗(最高位在P2.7,最低位在P2.0)?但是,用户手册上说“Each bit in each PxIN register reflects the value of the input signal at t ...…

查看全部问答>

三星的eMMC iNAND和DDR3 SDRAM跳楼价甩了

三星的eMMC iNAND(型号KLM2G1DEHE)大概还有50片左右,DDR3 SDRAM(型号K4B2G0846C)大概30片的样子都是BGA封装,冰点吐血价5元每片,照例上图 淘宝小店:http://shop34118588.taobao.com/…

查看全部问答>

CCS5.2中C程序单步过程调用汇编子程序时,反汇编一片空白

点SUSPEND后,可以看到反汇编,也可以继续单步。这是怎么回事?…

查看全部问答>

数字基带编码软件

自己写的数字基带编码软件 征集网友验证程序的正确性, 跟帖给出验证的例子与结果…

查看全部问答>