首页 > 代码库 > C语言中的作用域,链接属性和存储类型
C语言中的作用域,链接属性和存储类型
作用域
当变量在程序的某个部分被声明的时候,他只有在程序的一定渔区才能被访问,编译器可以确认4种不同类型的作用域:文件作用域,函数作用域,代码块作用域和原型作用域
1.代码块作用域:位于一对花括号之间的所有语句称为一个代码块.任何在代码块的开始位置声明的标识符都具有代码块作用域,表示他可以被这个代码块中的所有语句访问.(例子中:f,g函数,i)
2.文件作用域:任何在所有代码块之外声明的标识符都具有文件作用域,他表示这些标识符从他们的声明之处直到他所在的源文件结尾处都是可以访问的.(例子中:a,b)
3.原型作用域:原型作用域只适用于在函数原型中声明的参数名.(例子中:c,h)
4.函数作用域:表示一个函数中的作用域.
例子:
int a;
int b(int c);
int d (int e){
int f:
int g(int h);
...
{
int f,g,i;
}
{
int i;
}
}
链接属性
当组成一个程序的各个源文件分别被编译之后,所有的目标文件以及那些从一个或者多个函数库中引用的函数链接在一起,形成可执行程序,如果相同的标识符出现在几个不同的源文件中.标识符的链接属性决定如何处理这些标识符.
链接属性一共有三种:external(外部),internal(内部)和none(无).
1.none:没有链接属性的标识符(none)总是被当做单独的个体.
2.internal:标识符在同一个源文件内的所有声明都指同一个实体,但位于不同源文件的多个声明则分属于不同实体
3.external:标识符不论声明多少次,位于几个源文件都表示同一个实体.
例子:
typedef char *a;
int b;
int c(int d){
int e;
int f(int g);
}
默认情况下:b,c,f的链接属性为external,其余标识符为none.
关键字extern和static用于在声明中修改标识符的链接属性.如果在默认是external属性前加上static,可以使他的属性变为internal.
比如上述 static int b;和static int c(int d)就变成这个源文件私有,不能被其他文件访问.
static只对默认属性为external的声明才有效果,对默认是none的效果完全不一样.
extern可以吧none属性的标识符变为external属性.
比如上述extern int e修改之后可以使用其他源文件的e标识符
存储类型
在程序中,变量存储类型决定他何时创建,何时销毁,以及他的值保持多久.有三个地方可以用于存储变量:普通内存,运行时堆栈,硬件寄存器.
普通内存:凡是在任何代码块之外声明的变量总是存储于静态内存中.这类变量称为静态变量,这类变量在程序启动时创建,终止时销毁.
运行时堆栈:在代码块内部声明的变量的默认存储类型是自动的,称为自动变量.如果在代码块内部声明的变量前面加上static,这个变量的存储类型就改变为静态,程序运行中一直存在
硬件寄存器:使用关键字register声明的变量表示寄存器变量,保存在硬件的寄存器中.他只能对自动变量声明
C语言中的作用域,链接属性和存储类型