链接属性
外部(external):属于external链接属性的标识符不论声明多少次,位于几个源文件都表示同一实体
内部(internal):属于internal链接属性的标识符在同一个源文件内的所有声明中都指同一个实体。
无(none):没有链接属性的标识符(none)总是被当作单独的个体,也就是说该标识符的多个声明被当作独立不同的实体。
存储类型
变量的存储类型是指存储变量值的内存类型。变量的存储类型决定变量何时创建、何时销毁以及它的值保持多久。有三个地方可以用于存储变量:普通内存、运行时堆栈、硬件寄存器。
静态变量:凡是在任何代码块之外声明的变量总是存储于静态内存中,也就是不属于堆栈的内存。
自动变量:在代码块内部声明的变量的缺省存储类型是自动的,它存储于堆栈中。
(关键字“register”可以用于自动变量的声明,提示它们应该存储于机器的硬件寄存器而不是内存中,这类变量称为寄存器变量。)
static关键字
1、当它用于函数定义时,或用于代码块之外的变量声明时static关键字用于修改标识符的链接属性,从external改为internal,但标识符的存储类型和作用域不受影响。用这种方式声明的函数或变量只能在声明它们的源文件中访问。
typedef char *a;
int b;
int c (int d)
{
int e;
int f (int g);
}
可以将第二第三行前面加上关键字static使它的链接属性变为internal,这样变量b和c就将为源文件私有
(static只对缺省链接属性为external的声明才有改变链接属性的效果)
typedef char *a;
static int b;
static int c (int d)
{
int e;
int f (int g);
}
2、当它用于代码块内部的变量声明时,static关键字用于修改变量的储存类型,从自动变量修改为静态变量,但变量的链接属性和作用域不受影响。用这种方式声明的变量在程序执行之前创建,在代码块执行完毕后销毁。
int a=5;
extern int b;
static int c
int d (int e)
{
int f =15;
register int b;
static int g=20;
extern int a;
{
int e;
int a;
extern int h;
}
{
int x;
int e;
}
}
static int i()
{
}
总结:
具有external链接属性的实体在其他语言的术语里称为全局实体,所以源文件中的所有函数均可以访问它。只要变量并非声明于代码块或函数定义内部,它在缺省情况下的链接属性即为external。