三种链接属性
组成一个程序有多个源文件,如果相同的标识符出现在多个源文件中,那么标识符的链接属性决定如何处理在不同文件中出现的标识符。
链接属性有三种:
external:外部 多个源文件中的相同标识符指向同一个实体
internal:内部 同一个源文件中标识符指向同一个实体
none:无 当做单独的实体,只有在代码块内部出现,每次出现都是不同的独立实体。
typede char *a;
int b;
int c(int d)
{
int e;
int f(int g);
}
其中,b,c和f为external属性,其他均为none。内部代码块和形参都是none属性。
只要变量并非声明于代码块或函数定义内部,他在缺省情况下链接属性为external,储存类型为静态储存,代码块内部使用extern可以使用它所引用的值是全局变量而非局部变量。
改变链接属性
关键词:extern和static用于修改标识符的链接属性。
当给b加上,static就就可把external属性,改变为internal属性。使得b是当前源文件的私有变量。
注意static只对链接属性为external的声明有效,如果对上面的e加上static是没有效果的,因为e的默认链接属性是none,而不是external。
extern为标识符指定external属性,这样就可以访问在其他位置定义的实体。
static int i;
int function()
{
int j;
extern int k;
extern int i;
}
上面的声明k的external属性,这样既可以访问在其他地方定义的k实体了。当具有文件作用域时,这个关键词是可选的,不过加上extern可以让其他人更倾清晰的明白你的意图
当extern用于源文件中一个标识符第一次声明时时表示有external属性,但是第二次或者第三次,它不会更改由第一次声明所指定的链接属性。上面的i,第一次由static修饰的internal属性,随后extern int i;并不修改i的internal链接属性。