- 作用域
- function--函数域
- file--文件域
- block--块域
- function prototype--函数原型域
- 链接
- 内部链接
- 外部链接
- 空链接
- 存储时期
- static--静态生命周期
- automatic--自动生命周期
九层之台,起于累土。
作用域
作用域:Scope of Identifiers。
同一标识符指定的不同实体要么具有不同的作用域,要么在不同的命名空间。
标准C定义了4个域:
- function(函数域)
- file(文件域)
- block(块域)
- function prototype(函数原型域)
函数域是指:从某函数的开始到函数的结束的一段范围。
标签 是唯一具有函数域的标识符类型。这意味着无论标签出现在该函数的什么地方,其对该函数的任何位置的代码都是可见的。
#includefile–文件域... void test() { if(...) goto label; label: ... }
如果某标识符的声明出现在所有的块或者参数列表之外,则具有文件域。
文件域的范围从标识符声明处开始,到包含该声明的文件结尾处。
#includeblock–块域... int a; void test() { ... }
如果某标识符的声明出现在块或函数定义中的参数声明列表中,则其具有块域。
块域的范围从标识符声明开始,到块的末尾结束。
#includefunction prototype–函数原型域... void test(int a) { int b; if(...) { int c; } }
如果某标识符的声明在函数声明的列表中,则其具有函数原型域。
函数原型域的范围一直到函数原型声明的末尾。
#include... void test(int a);
链接
链接:linkage of Indentifiers
作用域是由编译器处理的属性,链接是由链接器处理的属性。
链接是一种属性,它描述了链接器如何链接标识符,是否只能在声明的文件中使用?是否可供另一个文件使用?…
链接有3种:
1.内部链接
2.外部链接
3.空链接
如果一个具有文件作用域的对象或者函数的声明包含static,则该标识符具有内部链接。
内部链接只能在声明该标识符的文件内使用。
#include外部链接... static int a; static void test();
外部链接是具有文件作用域的对象或函数的默认属性,可以在一个多文件程序的任何地方使用。
extern可以指定一个标识符具有外部链接,如果extern声明的标识符的先前声明可见并指定了内部或外部链接,则这个声明的标识符与之前声明的标识符的链接相同,如果没有可见的先前声明或者先前声明没有指定链接,则标识符具有外部链接。
#include空链接int a; ... #include extern int a;
具有块作用域和函数原型作用域的对象具有空链接。
存储时期
存储时期又叫生命周期,针对的是对象。
有2种生命周期:
1.static–静态生命周期
2.automatic–自动生命周期
具有文件作用域,或者带有static声明的对象具有静态生命周期,它的生命周期是程序的整个执行过程,它的值只在程序开始初始化一次。
#includeautomatic–自动生命周期... int a; void test() { static int b; }
非文件作用域且没有static声明的对象具有自动生命周期。
具有自动生命周期的对象的生命周期,从定义对象开始,直到代码执行到该对象作用域的结束。


![[C语言基础]作用域,链接,存储周期 [C语言基础]作用域,链接,存储周期](http://www.mshxw.com/aiimages/31/302547.png)
