内部链接和外部链接【转】

from here

首先,我们来了解下定义:

内部连接:如果一个名称对编译单元(.cpp)来说是局部的,在链接的时候其他的编译单元无法链接到它。

外部连接:如果一个名称对编译单元来说不是局部的,而在链接的时候其他的编译单元可以访问它,也就是说它可以和别的编译单元交互。

 

通过对LIB与DLL的讲解,我们可以更方便的理解内部连接与外部连接。

我们了解了一个编译单元(.cpp)编译成obj文件后,至少还会有未解决符号表、导出符号表、地址重定向表。而如果这个名称是内部连接的话,那在导出符号表中不存储它的入口。也就是别的obj文件无法链接到这个名称。而外部连接刚好相反,在导出的符号表中有它入口。

 

以下情况有内部连接: 内部链接要是实现在自己内部,那么每次调用都每次实现,不会分不清!
a)所有的声明
b)名字空间(包括全局名字空间)中的静态自由函数、静态友元函数、静态变量的定义
c)enum定义
d)inline函数定义(包括自由函数和非自由函数)
e)类的定义
f)名字空间中const常量定义
g)union的定义

以下情况是外部连接: 外部链接就必须要写到一个cpp文件内,这样会出在一个导出表中,其他函数比如main函数可以找到入口进行应用。如果是多个cpp文件那么就不知道入口在哪里! 不确定是那个cpp文件的

a)非static全局变量与全局函数

b)类非inline函数总有外部连接。包括类成员函数和类静态成员函数
c)类静态成员变量总有外部连接
d)名字空间(包括全局名字空间)中非静态自由函数、非静态友元函数及非静态变量

 

posted @ 2017-09-11 12:16  chenhuan001  阅读(600)  评论(0编辑  收藏  举报