链接属性
当组成一个程序的各个源文件分别被编译后,所有的目标文件以及那些从一个或多个函数库中引用的函数链接在一起,形成可执行程序。
external | extern | 可在源文件之外访问 |
internal | static | 只可在代码块内部或是函数内或是源文件内部访问 |
none |
存储类型
普通内存 | 代码块之外的变量,即为静态变量 |
动态堆栈 | 代码块内部声明的变量 |
硬件寄存器 | 使用register声明的变量,寄存器说明符只能用于说明函数中的变量和函数中的形参,因此不允许将外部变量或静态变量说明为"register"。 register型变量常用于作为循环控制变量,这是使用它的高速特点的最佳场合 |
static的使用
函数定义 | 只修改链接属性,不会改变存储类型和作用域,简单来说:只能在本源文件中使用 |
代码块之外变量的定义 | 同上 |
代码块内部变量的定义 | 修改了变量的存储类型,从自动变量改为了静态变量。但是链接属性和作用域不会改变。简单来说:存在时间变长了,不知是在代码块开始执行时创建,而是在整个程序执行前创建,在程序的执行期间一直存在。 |
代码分析:
int a=5;
extern int b;
static int c; //a,b,c均为static变量,不会存储于动态堆栈中。其作用域一直延伸到源文件结束为止。但在d(int),i()两块代码块中被同名变量屏蔽,
int d(int e) //在d开始执行时,e创建,d结束时,e销毁。
{
int f=15; //局部变量,函数结束就销毁
register int b; //b是寄存器变量,所以它的初始值是垃圾。
static int g=20; //程序执行过程会一直存在。
extern int a; //extern可以省略,无影响
......
{
int e;
int a; //屏蔽之前声明的a,它在这里是不可访问的
extern int h;
......
}
......
{
int x;
int e;
}
......
}
static int i()
{
......
}
......
编程经验:
1.为了保持最佳的可移植性,尽量将字符的值限制在有符号和无符号值的交集范围之内。或者不要在字符上执行算术运算。
2.不要把整形值和枚举一同