关于链接 Linkage
1.链接的类型
内部链接:如果一个名称对于它的编译单元来说是局部的,并且在连接时不会与其它编译单元中的同样的名称相冲突,那么这个名称有内部连接。
外部链接:一个名称在连接时可以和其它编译单元共享。
2. 文件中链接的情况:
- 声明为static类型的具有内部链接
- Enumerator 和typedef names 没有链接
- 其他的名称具有外部链接
类具有内部链接,如果:
- 没有使用C++机制(如成员函数,构造函数等)
- 没有在其他外部链接的名称中使用。(如作为外部链接函数的形参)
3. 类中链接的情况:
- static 成员变量,外部链接
- 成员函数,外部链接
- Enumerator 和typedef names 没有链接
4. 块({ })中链接的情况:
- extern声明的具有外部链接除非先被声明为static
- 其他的无链接
#include <iostream> static int static_g = 0; int global; class Point { static int static_in_class; int x; int y; public: void Moveto(Point pt); }; int static_in_class = 0; void Point::Moveto(Point pt) { } int main() { //extern int extern_block =0;//example.cpp(23) : error C2205: 'extern_block' : cannot initialize extern variables with block scope int block = 1; return 0; }
查看目标文件:dumpbin /SYMBOLS example.obj>2.txt
External | ?static_in_class@@3HA (int static_in_class)
Static | _static_g
External | ?global@@3HA (int global)
External | ?Moveto@Point@@QAEXV1@@Z (public: void __thiscall Point::Moveto(class Point))
External | _main
另外,声明为__inline的函数,没有链接,如果其他文件需要调用可以用__declspec( dllexport ) __inline void func();声明,则会生产外部链接符号。
msdn,Program and Linkage,http://msdn.microsoft.com/zh-cn/library/twzxez83.aspx