关于链接 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

原文地址:https://www.cnblogs.com/mlj318/p/2245434.html