链接性是程序
编译时,程序中的名字(name,也可称标识符identifier)在作用域中不同位置的出现能够绑定到同一对象或函数。
C++语言中,链接性描述了名字在整个程序或单独编译单元中能否绑定到同一实体(entity)。
变量的链接性
链接性(linkage)描述了名称如何在不同单元间共享。链接性为外部的名称,可在文件间共享,连接性为内部的名称,只能由一个文件中的函数共享。自动变量的名称没有链接性,因为它不能共享。
链接性为外部的变量,通常简称为外部变量,它们的存储持续性为静态,作用域为整个文件。
静态链接性
静态链接性(static linkage)也称为内部链接性(internal linkage)。static关键字在C/C++中限定名字在一个函数内或一个编译单元内可见。(C++ 98/C++03废弃这一用法,用匿名命名空间取代。但C++11又恢复了这一用法)。
C++隐式把具有const限定的命名空间中的变量处理为内部链接性,除非在const限定声明之时或之前已经声明为extern。这与C语言完全不同。
具有内部链接性的:
具有内部链接性的名字,在编译后不会产生链接符号(或者称修饰名字),因此不与链接器打交道。
外部链接性
外部链接性(external linkage)也称为全局链接性(global linkage)。具有全局链接性的名字可以在不同编译单元声明并绑定到同一实体。
具有外部链接性的:
无链接性
无链接性(no linkage)的名字具有局部作用域。如局部变量、函数形参等。
跨语言链接
示例
函数的链接性
在默认情况下,函数的链接性为外部的,即可以在文件间共享。可以在函数原型中使用关键字extern来指出函数是在另一个文件中定义的,不过这是可选的。
可以使用关键字static将函数的链接性设置为内部的,使之只能在一个文件中使用。必须同时在原型和函数定义中使用static关键字。
这意味着该函数只在这个文件中可见,还意味着可以在其他文件中定义同名的函数。和变量一样,在定义静态函数的文件中,静态函数将覆盖外部定义,因此,即使在外部定义了同名的函数,该文件扔将使用静态函数。
单定义规则也适用于非内联函数,因此对于每个非内联函数,程序只能包含一个定义。对于链接性味外部的函数来说,这意味着在多文件程序中,只能有一个文件包含该函数的定义,但使用该函数的每个文件都应包含其函数原型。
内联函数不受这种规则的约束,这允许程序员能够将内联函数的定义放在头文件中,这样包含了头文件的每个文件都有内联函数的定义。然而,C++要求同一个函数的素有内联定义都必须相同。
所有声明都具有外部链接性
具有内部连接性的定义
名字空间(包括全局名字空间)中的静态自由函数,静态友元函数、静态变量定义,const常量定义;enum定义,类的定义,union的定义;inline函数定义(包括自由函数和非自由函数)。
具有外部连接性的定义
非inline的类成员函数,非inline的类静态函数;类
静态成员变量;名字空间(包括全局名字空间)中非静态自由函数,非静态友元函数,非静态变量。