链接属性:
当组成一个程序的各个源文件分别被编译之后,所有的目标文件以及那些从一个或多个函数库中引用的函数链接在一起,形成可执行程序。然而,如果相同的标识符出现在几个不同的源文件中时,它们是表示同一个实体?
标识符的链接属性决定如何处理在不同文件中出现的标识符。标识符的作用域与它的链接属性有关,但不相同。
链接属性共有3种—— external (外部)、internal (内部)、none(无);
none(无)标识符总是被当成单独的个体,也就是说该标识符的多个声明被当成独立不同的实体。
internal(内部)标识符在同一个源文件内的所有声明都指向同一个实体,但位于不同源文件的多个声明则分属不同的实体。
external(外部)标识符不论声明多少次,位于几个源文件都表示同一个实体。
图中通过展示名字声明的所有不同方式,描述了链接属性。在缺省情况下,标识符 b 、c 和 f 的链接属性为external ,其余标识符的链接属性则为 none 。因此,如果另一个源文件也包含了标识符 b 的类似声明并调用函数 c ,它们实际上访问的是这个源文件所定义的实体。f 的链接属性之所以是 external 是因为它是个函数名。在这个源文件中调用函数 f ,它实际上将链接到其他源文件所定义的函数,甚至这个函数的定义可能出现在某个函数库。
修改链接属性:
关键字 extern 和 static 用于在声明中修改标识符的链接属性。如果某个声明在正常情况下具有 external 链接属性,在它前面加上 static 关键字可以使它的链接属性变为 internal 。如:
static int b;
那么变量 b 就将为这个源文件所私有。在其他源文件中,如果也链接到一个叫做 b 的变量,那么它所引用的是另一个不同的变量。类似,你也可以把函数声明为 static ,如:
static int c(int d);
这样就可以防止它被其他源文件调用。
static 只对缺省链接属性为 external 的声明才有改变链接属性的效果。例如,你尽管可以在声明5前面加上 static
关键字,但它的效果完全不同,因为 e 的链接属性并不是 external 。
extern 关键字的规则很复杂 。它为一个标识符指定 external 链接属性,这样就可以访问在其他任何位置定义的这个实体。
Linux C笔记之 链接属性 详解
原文:http://www.cnblogs.com/jianghanxv/p/5521655.html