zoukankan      html  css  js  c++  java
  • 关于链接 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

  • 相关阅读:
    boltdb 学习和实践
    解读-m addrtype --dst-type LOCAL -j DOCKER
    找到linux中当前java的安装位置
    java.library.path是什么?
    Linux 中【./】和【/】和【.】之间有什么区别?
    [SpringMVC]JSON乱码问题
    iOS MVVM的理解与分析
    iOS中为什么必须在主线程操作UI
    几种直播流媒体协议
    IOS硬编码
  • 原文地址:https://www.cnblogs.com/mlj318/p/2245434.html
Copyright © 2011-2022 走看看