文件1
#include<stdio.h>
main(){
extern int a;//a指定为external连接属性
printf("%d",a);//a值为100
f();//输出为hello!
}
文件2
#include <stdio.h>
int a=100;//全局变量,其它文件可访问
static int b;//限于在本文件中使用的变量
f(){//具有external连接属性
printf("hello!");
}
static d(){}//internal连接属性
3种链接属性:external(外部),internal(内部)和none(无)。
none:总是被当作单独的个体,也就是说该标示符的多个声明被当作独立不同的实体。
internal:在同一个源文件内的所有声明中都指同一个实体,但位于不同源文件的多个声明则分属不同的实体。
external:不论声明多少次,位于几个源文件都表示同一个实体。
如果某个声明在正常情况下具有external链接属性,在它前面加上static关键字可以使它的链接属性变为internal。如下声明文件2中的a:
static int a;这样a就将为这个源文件所私有。如果在其它文件中有链接到一个叫做a的变量,那么它所引用的是另一个不同的变量。也可把函数声明为static,如下:
static int c(){} 这样可以防止它被其他源文件调用。
static只对缺省链接属性为external的声明才有改变链接属性的效果。
(static用于声明局部变量时,是使这个变量成为静态变量,就是这个变量在程序的整个运行过程中总是存在的,直到程序结束,一般来说局部变量在运行完它所在的语句块后就会自动释放。这样是为了使这个变量在下次运行时能使用上次的结果。)
extern:一般而言,它为一个标示符指定external连接属性,这样可以访问其它任何位置定义的这个实体。但它不能用于更改第一次声明所指定的连接属性。如:
static int i;
f(){
.....
extern int k;
extern int i;
}
在这个当中,i的链接属性仍为internal。