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

c语言中static关键字和extern关键字

2016-11-08 11:42 337 查看
看extern关键字和static关键字之前请看一下之前写的一篇博客,便于更深的理解:http://blog.csdn.net/baidu_32134295/article/details/53078872

1.static关键字

        当它用于函数定义时,或用于代码块之外的变量声明时,static关键字用于修改标识符的链接属性,从external改为internal,但标识符的存储类型和作用域不受影响。用这种方式声明的函数或者变量只能在声明它们的源文件中访问。

当它用于代码块内部的变量声明时,static关键字用于修改变量的存储类型从自动变量改为静态变量,但变量的链接属性和作用域不受影响。用这种方式声明的变量在程序执行之前创建,并在程序的整个执行期间一直存在,而不是每次在代码块开始执行时创建,在代码块执行完毕后销毁。

2.extern关键字

具有external链接属性的实体在其他语言的术语里称为全局(global)实体,所有源文件中的所有函数均可以访问它。只要变量并非声明于代码块或函数定义内部,它在缺省情况下的链接属性即为external。如果一个变量声明于代码块内部,在它前面添加extern关键字将使它所引用的是全局变量而非局部变量

具有external链接属性的实体总是具有静态存储类型。全局变量在程序开始执行前创建,并在程序整个执行过程中始终存在。从属于函数的局部变量在程序开始执行时创建,在函数执行完毕后销毁,但用于执行函数的机器指令在程序的声明周期内一直存在。

局部变量由函数内部使用,不能被其他函数通过名字引用,他在缺省情况下的存储类型为自动,这是基于两个原因:其一,当这些变量需要时才为它们分配存储,这样可以减少内存的总需求量。其二,在堆栈上为它们分配存储可以有效的实现递归。如果你觉得让变量的值在函数的多次调用中始终保持原先的值非常重要的话,你可以修改它的存储类型,把它从自动变量改为静态变量。



                                                                                   作用域、链接属性和存储类型总结图

下面用代码例子进行说明:

1 int  a = 5; //链接属性为external

2 extern int b; //链接属性为external

3 static int c; //static关键字修改了c的缺省链接属性,把它改为internal -->由此变量c只能由这个源文件访问

/*这里变量a、b、c的存储类型为静态,表示它们并不是存储在堆栈中。因此,这些变量在程序执行之前创建,并一直保持它们的值,直到程序结束

这些变量的作用域一直延伸到这个源文件结束为止,但第7行和第13行声明的局部变量a和b在那部分程序中将隐藏同名的静态变量。因此,这三个变量的

作用域为:

a 第1行至12行,第17行至29行

b 第 2行至6行,第25行至29行

c 第3行至29行

*/

4 int d(int e)//d在缺省情况下具有external链接属性,所以其他源文件只要在文件上存在d的原型,就可以调用d。对于函数而言,存储类型并不是问题,因为代码总是存储在静态内存中。

5 {

6 int f = 15;

7 refister int b;

8 static int g = 20;

9 extern int a;

10 ...

11 {

12 int e;// 12-13行代码块声明局部变量。他们都具有自动存储类型,它们的作用域到16行,这些变量和先前声明的a和e不同,而且由于名字冲突

13 int a;//这个代码块中以前声明的同名变量是不能被访问的

14 extern int h;//全局变量h在这个代码块中可以被访问。它存储于静态内存中。这是唯一一个必须使用关键字extern的声明,没有它,h将变成另一个局部变量

15 ...

16 }

17 ...

18 {

19 int x;

20 int e;//这个e和参数e是不同的变量

21 ...

22 }

23 ...

24 }

25 static int i()//i为静态链接属性。可以防止它被这个源文件之外的任何函数调用。I的作用域从它声明的位置直到这个源文件结束。

// 函数d不可以调用函数i ,因为在d 之前不存在i的原型

26 {

27 ...

28 }

29 ...
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: