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

  • 相关阅读:
    SCM基础之SCM配置管理计划重要性
    SCM基础之合理设计配置库
    SCM英文术语
    中国歼20隐形战机首飞成功
    SCM基础之过程描述
    SCM基础之基线审核
    SCM基础之组织结构设计
    SCM基础之如何做到配置管理
    配置管理介绍
    软件配置管理的任务
  • 原文地址:https://www.cnblogs.com/mlj318/p/2245434.html
Copyright © 2011-2022 走看看