1) 启动模块
创建C/C++程序时,链接器会链接启动模块,这个初始化程序会建立堆栈,初始化变量。
2) 库函数
尽量使用C/C++标准库函数,实在没有,也尽量使用符合
POSIX可移植性标准的函数。
3) 内部链接
如果一个名称对于它的编译单元(cpp)来说是局部的,并且在链接时不会与其它编译单元(cpp)中同样的名称相冲突,那么称这个名称有内部链接。
内部链接不可能通过extern变量去访问位于其他编译单元定义的变量。
(注意:有时也将声明看作是无链接的,这里我们统一看成是内部链接的)。
l 所有的声明
声明举例请参考
http://blog.youkuaiyun.com/yeming81/archive/2010/05/31/5637695.aspx
l 命名空间(包括全局空间)中的静态函数、静态友元函数、静态变量的定义
各个命名空间中的名称不会冲突,所以是内部链接。全局的静态函数是内部链接,因为static控制作用域在本文件(编译单元)中。
l enum定义
l struct定义
l union的定义
l inline函数定义
包括全局和类里面定义的。如果有两个同名的函数,会出现链接错误。加上inline就可以了,因为内部链接的缘故。
l 类的定义
也就是说在不同的文件里出现同名的类是不会出现链接错误的,因为名字不冲突。这也是为什么include同一个class定义不会报错的原因。
l 命名空间中const常量定义
也就是说在不同的文件里出现同名的常量是不会出现链接错误的,因为名字不冲突。
4) 外部链接
除了内部链接都属于外部链接,举例如下:
l 类的非inline函数定义
如果在A.cpp中有类A的定义,B.cpp也有类A的定义。没问题,因为类的定义属于内部链接。但是,如果A类有一个非inline函数Func1,B中的A类也有一个同名的函数Func1,这时候就出现链接错误。
l 类的静态变量的定义
如果不同文件的同名类含有同样名字的静态变量,链接时出错。
l 全局函数(非static)和变量(非const)
l 命名空间
5) 无链接
只有那些在链接或装载期间有地址的元素,才有链接。比如类声明或局部变量就无链接。