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