什么是外部联系和内部联系?

我想了解外部联系和内部联系及其差异。

我也想知道的意义

const变量默认内部链接,除非另外声明为extern


当您编写实现文件( .cpp.cxx等)时,编译器会生成一个翻译单元 。 这是来自实施文件的目标文件以及#include所有标题。

内部联系是指仅在翻译单位范围内的所有内容。

外部联系是指超出特定翻译单位的东西。 换句话说, 可以通过整个程序 (即所有翻译单元(或目标文件)的组合)访问。


正如dudewat所说,外部链接意味着符号(功能或全局变量)可在整个程序中访问,而内部链接意味着它只能在一个翻译单元中访问。

您可以使用externstatic关键字明确控制符号的链接。 如果未指定的联动是默认键是extern用于非const符号和static (内部)为const的符号。

// in namespace or global scope
int i; // extern by default
const int ci; // static by default
extern const int eci; // explicitly extern
static int si; // explicitly static

// the same goes for functions (but there are no const functions)
int foo(); // extern by default
static int bar(); // explicitly static 

请注意,不要使用static内部链接,最好使用匿名命名空间,您也可以将class放入其中。 匿名命名空间的链接在C ++ 98和C ++ 11之间发生了变化,但主要原因是它们无法从其他翻译单元访问。

namespace {
   int i; // external linkage but unreachable from other translation units.
   class invisible_to_others { };
}

  • 全局变量默认具有外部链接。 通过在另一个文件中给出匹配的extern声明,它的范围可以扩展到除包含它之外的文件。
  • 通过在声明前添加关键字static,可以将全局变量的范围限制为包含其声明的文件。 据称这些变量具有内部联系。
  • 考虑下面的例子:

    1.cpp

    void f(int i);
    extern const int max = 10;
    int n = 0;
    int main()
    {
        int a;
        //...
        f(a);
        //...
        f(a);
        //...
    }
    
  • 函数f的签名将f声明为具有外部链接的函数(默认)。 其定义必须在本文档或其他翻译单元(以下给出)中稍后提供。
  • max被定义为一个整数常量。 常量的默认链接是内部的。 它的连接被更改为外部关键字extern。 所以现在max可以在其他文件中访问。
  • n被定义为一个整数变量。 在函数体外定义的变量的默认链接是外部的。
  • 2.cpp

    #include <iostream>
    using namespace std;
    
    extern const int max;
    extern int n;
    static float z = 0.0;
    
    void f(int i)
    {
        static int nCall = 0;
        int a;
        //...
        nCall++;
        n++;
        //...
        a = max * z;
        //...
        cout << "f() called " << nCall << " times." << endl;
    }
    
  • max声明为具有外部链接。 max(与外部链接)的匹配定义必须出现在某个文件中。 (如1.cpp)
  • n被宣布具有外部链接。
  • z被定义为具有内部链接的全局变量。
  • nCall的定义将nCall指定为一个变量,该变量在函数f()的调用中保留其值。 与具有默认自动存储类的局部变量不同,nCall将在程序开始时仅被初始化一次,而不会在每次调用f()时被初始化一次。 存储类说明符静态影响局部变量的生存期而不影响其范围。
  • 注意:静态关键字具有双重作用。 当用于全局变量的定义时,它指定内部链接。 当用于局部变量的定义时,它指定变量的生命周期将是程序的持续时间,而不是该函数的持续时间。

    希望有所帮助!

    链接地址: http://www.djcxy.com/p/73049.html

    上一篇: What is external linkage and internal linkage?

    下一篇: What exactly is One Definition Rule in C++?