C99标准 6.2.2 标识符的链接
在不同作用域中或在同一作用域中多次声明的标识符可以通过称为链接 [1](linkage)的进程来引用相同的对象或函数。有三种链接:外部链接(external)、内部链接(internal)和无链接(none)。
[1] 不同标识符之间没有链接。
在构成整个程序的翻译单元(translation units)和库(libraries)集合中,具有外部链接的特定标识符的每个声明都表示相同的对象或函数。在一个翻译单元中,具有内部链接的标识符的每个声明都表示相同的对象或函数。无链接的标识符的每个声明都表示一个唯一的实体。
如果对象或函数的文件作用域标识符的声明包含存储类型说明符static,则该标识符具有内部链接 [2]。
[2] 只有当函数声明位于文件作用域时,函数声明才能包含static存储类型说明符;见 6.7.1。
由存储类型说明符 extern 声明的标识符,在该标识符的先前声明可见的作用域内[3],如果先前声明指定了内部或外部链接,则在随后声明中的标识符的链接与在先前声明中指定的链接相同。如果先前的声明不可见,或者先前的声明没有指定链接,则标识符具有外部链接。
[3] 如6.2.1所述,后面的声明可能隐藏前面的声明。
如果函数标识符的声明没有存储类型说明符,则它的链接被确定为与使用存储类型说明符 extern 声明的链接完全一样。如果对象标识符的声明具有文件作用域而没有存储类型说明符,则其链接是外部的。
以下标识符没有链接:声明为对象或函数以外的任何标识符;声明为函数形参的标识符;未使用存储类型说明符 extern 声明的具有块作用域的对象标识符。
如果在一个翻译单元中,相同的标识符同时包含内部和外部链接,则该行为是未定义的。
提前引用: 声明(6.7), 表达式(6.5), 外部定义(6.9), 语句(6.8)。