您的位置:首页 > 编程语言 > C语言/C++

stm32f103学习笔记——关键字extern、static、const

2015-04-06 21:07 337 查看
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修饰。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息