zoukankan      html  css  js  c++  java
  • 内部链接和外部链接【转】

    from here

    首先,我们来了解下定义:

    内部连接:如果一个名称对编译单元(.cpp)来说是局部的,在链接的时候其他的编译单元无法链接到它。

    外部连接:如果一个名称对编译单元来说不是局部的,而在链接的时候其他的编译单元可以访问它,也就是说它可以和别的编译单元交互。

    通过对LIB与DLL的讲解,我们可以更方便的理解内部连接与外部连接。

    我们了解了一个编译单元(.cpp)编译成obj文件后,至少还会有未解决符号表、导出符号表、地址重定向表。而如果这个名称是内部连接的话,那在导出符号表中不存储它的入口。也就是别的obj文件无法链接到这个名称。而外部连接刚好相反,在导出的符号表中有它入口。

    以下情况有内部连接: 内部链接要是实现在自己内部,那么每次调用都每次实现,不会分不清!
    a)所有的声明
    b)名字空间(包括全局名字空间)中的静态自由函数、静态友元函数、静态变量的定义
    c)enum定义
    d)inline函数定义(包括自由函数和非自由函数)
    e)类的定义
    f)名字空间中const常量定义
    g)union的定义

    以下情况是外部连接: 外部链接就必须要写到一个cpp文件内,这样会出在一个导出表中,其他函数比如main函数可以找到入口进行应用。如果是多个cpp文件那么就不知道入口在哪里! 不确定是那个cpp文件的

    a)非static全局变量与全局函数

    b)类非inline函数总有外部连接。包括类成员函数和类静态成员函数
    c)类静态成员变量总有外部连接
    d)名字空间(包括全局名字空间)中非静态自由函数、非静态友元函数及非静态变量

  • 相关阅读:
    【LeetCode OJ】Remove Element
    【LeetCode OJ】Remove Duplicates from Sorted Array
    【LeetCode OJ】Swap Nodes in Pairs
    【LeetCode OJ】Merge Two Sorted Lists
    【LeetCode OJ】Remove Nth Node From End of List
    【LeetCode OJ】Two Sum
    【LeetCode OJ】Majority Element
    最长公共子序列问题
    php fopen与file_get_contents的区别
    PHP 技巧集合
  • 原文地址:https://www.cnblogs.com/chenhuan001/p/7504365.html
Copyright © 2011-2022 走看看