为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

C++
慕的地10843 2019-06-15 11:11:31
什么是外部联系和内部联系?我想了解一下对外联系和内部联系及其区别。我也想知道const默认情况下,变量内部链接,除非另有声明为extern.
查看完整描述

3 回答

?
慕少森

TA贡献2019条经验 获得超9个赞

编写实现文件时(.cpp.cxx等等)您的编译器生成一个翻译单位..这是实现文件中的对象文件,再加上所有的标头。#includeD在里面。

内部联动仅指一切在翻译单位的范围内.

外部联动指存在于特定翻译单位之外的事物。换句话说,可通过整个程序访问,它是所有翻译单元(或对象文件)的组合。


查看完整回答
反对 回复 2019-06-15
?
四季花海

TA贡献1811条经验 获得超5个赞

杜德瓦 外部链接意味着符号(函数或全局变量)在整个程序中都是可访问的,并且内部链接意味着它只能在一个翻译单位.

属性显式控制符号的链接。externstatic关键词。如果未指定链接,则默认链接为extern对于非-const符号和static(内部)const符号。

// in namespace or global scopeint i; // extern by defaultconst int ci; // static by defaultextern const int eci;
 // explicitly externstatic int si; // explicitly static// the same goes for functions (but there are no const functions)int foo();
  // extern by defaultstatic 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 { };}


查看完整回答
反对 回复 2019-06-15
?
红颜莎娜

TA贡献1842条经验 获得超12个赞

  • 全局变量

    外部联动

    默认情况下。它的作用域可以扩展到文件,而不是通过提供匹配来包含它。

    外露

    在另一个文件中声明。
  • 全局变量的作用域可以限制为包含其声明的文件,方法是以关键字作为声明的前缀。

    静态

    ..这些变量据说有

    内部联动.

考虑以下例子:

1.cpp

void f(int i);extern const int max = 10;int n = 0;int main(){
    int a;
    //...
    f(a);
    //...
    f(a);
    //...}
  1. 函数f的签名将f声明为具有

    外部联动

    (默认)其定义必须在本文件后面或其他翻译单位中提供(如下所示)。
  2. MAX被定义为整数常量。常量的默认链接是

    内部

    ..它的链接用关键字更改为外部。

    外露

    ..所以现在max可以在其他文件中访问。
  3. 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;}
  1. 马克斯被宣布

    外部联动

    ..max的匹配定义(具有外部链接)必须出现在某个文件中。(如1.cpp所示)
  2. N被宣布为

    外部联动.

  3. Z是

    定义

    作为全局变量

    内部联动.

  4. nCall的定义指定nCall是一个在函数f()的调用中保留其值的变量。与具有默认自动存储类的局部变量不同,nCall在程序开始时只初始化一次,而不对f()的每次调用初始化一次。存储类说明符

    静态

    影响局部变量的生存期,而不是其作用域。

注:关键词静态扮演双重角色。在全局变量定义中使用时,它指定内部联动..当在局部变量定义中使用时,它指定变量的生存期将是程序的持续时间,而不是函数的持续时间。

希望能帮上忙!


查看完整回答
反对 回复 2019-06-15
  • 3 回答
  • 0 关注
  • 1580 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信