7.链接属性
链接属性一共有3种——external(外部)、internal(内部)和none(无)。没有链接属性的标识符(none)总是被当做单独的个体,也就是说该标识符的多个声明被当作独立不同的实体。属于internal链接属性的标识符在同一个原文件内的所有声明中都指同一个实体,但位于不同源文件的多个声明则分属不同的实体。最后,属于external链接属性的标识符不论声明多少次、位于几个源文件都表示同一个实体。
函数名、外部变量默认的链接属性为external,而局部变量的默认链接属性为none。同时关键字extern和static用于在声明中修改标识符的链接属性,如果某个声明在正常情况下具有external链接属性,在它的前面加上static关键字可以使它的链接属性变为internal。static只对缺省链接属性为external的声明才有改变链接属性的效果。而extern关键字的规则更为复杂,一般而言,它为一个标识符指定external链接属性,这样可以访问在其他任何位置定义的这个实体。如下的例子:
static int i;
int func()
{
int j;
extern int k;
extern int i;
......
}
分析:extern int k;这个声明表示在该函数体内的后续部分可以访问其他源文件中定义的k变量实体。而当extern关键字用于源文件中一个标识符的第一次声明时,它指定该标识符具有external链接属性;但是如果它用于该标识符的第2次或以后的声明时,它并不会更改由第1次声明所指定的链接属性。所以extern int i;声明不会修改i的static属性。