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修饰。
上一篇:stm32L151 tim trigger adc定时器触发单通道adc采样dma传输
下一篇:学习下stm32 配置 HSI作为系统时钟,但意义不大,一般不这样
推荐阅读最新更新时间:2024-11-10 18:10
设计资源 培训 开发板 精华推荐
- 紧凑、多功能、准确、三态可编程电源监控器
- 采用低功耗蓝牙和电容式触控技术的门禁控制面板参考设计
- 用于有刷直流电机的桥驱动IC —— TB67H301FTG
- ARWSCBRD-XRS7004E,SpeedChip XRS7000E 参考板,基于 ARWSC-XRS7004E 以太网交换机,支持 HSR & PRP
- LTC4061EDD 演示板,具有 NTC 的单节锂离子电池充电器,+Vin = 4.3V-8V,Bat = 4.2V@0.5A/1A
- BB-BONE-RF-01, BeagleBone RF Cape Board 基于 CC1101 RF Transceiver
- LTC6263IMS 235 uA 电源电流运算放大器的典型应用
- 小车走迷宫
- KTXSWITCHG3UG,用于四路高边开关的 KIT 极限开关评估板
- AN-EVAL-ILD6150,基于 ILD6150 60V/1.5A 高效降压 LED 驱动器的演示板,具有可调热保护