C/C++ 内部连接与外部连接

编译单元:

  当一个c或cpp文件在编译时,预处理器首先递归包含头文件,形成一个含有所有必要信息的单个源文件,这个源文件就是一个编译单元。

  这个编译单元会被编译成为一个与cpp文件名同名的目标文件(.o或是.obj)。连接程序把不同编译单元中产生的符号联系起来,构成一个可执行程序。

自由函数

  如果一个函数是自由函数,那么这个函数不是类的成员函数,也不是友元函数。

内部连接:

  如果一个名称对于它的编译单元来说是透明的,并且在连接时不会与其它编译单元中的同样的名称相冲突,那么这个名称有内部连接(注:有时也将声明看作是无连接的,这里我们统一看成是内部连接的)。

以下情况为内部连接:

  a)所有的声明

  b)名字空间(包括全局名字空间)中的静态自由函数、静态友元函数、静态变量的定义

  c)enum定义

  d)inline函数定义(包括自由函数和非自由函数) 。内部连接的一个好处是这个名字可以放在一个头文件中而不用担心连接时发生冲突。

  e)类的定义

  f)名字空间中const常量定义

  g)union的定义

外部连接:

  在一个多文件程序中,如果一个名称在连接时可以和其它编译单元交互,那么这个名称就有外部连接。 

以下情况有外部连接: 

  a)类非inline函数总有外部连接。包括类成员函数和类静态成员函数 

  b)类静态成员变量总有外部连接。 

  c)名字空间(包括全局名字空间)中非静态自由函数、非静态友元函数及非静态变量

  下面举例说明: 

  a)声明、enum定义、union定义有内部连接 

  所有的声明、enum定义及union定义在编译后不会产生连接符号,也就是在不同编译单元中有相同名称的声明及enum、union定义并不会在连接时发生发现多个符号的错误。

http://www.cnblogs.com/ForFreeDom/archive/2012/05/28/2520873.html

原文地址:https://www.cnblogs.com/jiahu-Blog/p/4506653.html