链接性
链接性(linkage)是程序编译时,程序中的名字(name,也可称标识符identifier)在作用域中不同位置的出现能够绑定到同一对象或函数。[1]C++语言中,链接性描述了名字在整个程序或单独编译单元中能否绑定到同一实体(entity)。
静态链接性
静态链接性(static linkage)也称为内部链接性(internal linkage)。static关键字在C/C++中限定名字在一个函数内或一个编译单元内可见。(C++ 98/C++03废弃这一用法,用匿名命名空间取代。但C++11又恢复了这一用法)。
C++隐式把具有const
限定的命名空间中的变量处理为内部链接性,除非在const
限定声明之时或之前已经声明为extern
。这与C语言完全不同。
具有内部链接性的:
- 所有的声明
- 命名空间(包括全局命名空间)中的静态自由函数、静态友元函数、静态变量的定义、const常量定义
- enum定义
- inline函数定义(包括自由函数和非自由函数)
- 类(class、struct、union)的定义
具有内部链接性的名字,在编译后不会产生链接符号(或者称修饰名字),因此不与链接器打交道。
外部链接性
外部链接性(external linkage)也称为全局链接性(global linkage)。具有全局链接性的名字可以在不同编译单元声明并绑定到同一实体。
具有外部链接性的:
- 非inline函数。包括命名空间中非静态函数、类成员函数和类静态成员函数
- 类静态成员变量总有外部链接。
- 命名空间(不包括无名命名空间)中非静态变量
无链接性
无链接性(no linkage)的名字具有局部作用域。如局部变量、函数形参等。
跨语言链接
不同编程语言对同一名字编译后得到的修饰名字可能不同。为了让C++语言写的程序能使用C语言程序,需要使用extern "C"
使得这段代码可链接。
示例
/* file demo1.c */
/* extern */ void foo(void); /* extern optional - it's the default */
int main(void)
{
foo();
return 0;
}
/* file demo2.c */
void foo(void)
{
/* ... */
}
参考文献
- ^ ISO/IEC 9899 (页面存档备份,存于互联网档案馆).C99语言标准官方文档. As of 2007 the latest version of the standard is ISO/IEC 9899:TC3PDF (3.61 MiB)