java外链_什么是外部链接和内部链接?

我想了解外部链接和内部链接及其区别。

我也想知道

除非默认声明为extern ,否则默认情况下const变量内部链接。

#1楼

编写实现文件( .cpp , .cxx等)时,编译器会生成翻译单元 。 这是实现文件中的目标文件,以及#include在其中的所有标头。

内部链接仅指翻译单元范围内的所有内容。

外部链接是指存在于特定翻译单元之外的事物。 换句话说, 可以通过整个程序访问 ,这是所有翻译单元(或目标文件)的组合。

#2楼

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

您可以使用extern和static关键字显式控制符号的链接。 如果未指定的联动是默认键是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 es放入其中。 在C ++ 98和C ++ 11之间,用于匿名名称空间的链接已更改,但主要的问题是,其他翻译单元无法访问它们。

namespace {

int i; // external linkage but unreachable from other translation units.

class invisible_to_others { };

}

#3楼

全局变量默认具有外部链接 。 通过在另一个文件中提供匹配的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定义为整数常量。 常量的默认链接是internal 。 使用关键字extern将其链接更改为外部。 因此,现在可以在其他文件中访问max 。

n被定义为整数变量。 在函数体外部定义的变量的默认链接为external 。

2.cpp

#include

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() nCall不会初始化一次。 存储类说明符static影响局部变量的生存期,而不影响其范围。

注意:关键字static具有双重作用。 在全局变量的定义中使用时,它指定内部链接 。 当在局部变量的定义中使用时,它指定变量的生存期将是程序的持续时间,而不是函数的持续时间。

希望有帮助!

#4楼

用“ C”表示(因为static关键字在“ C”和“ C ++”之间具有不同的含义)

让我们来谈谈“ C”中的不同范围

范围:基本上,我可以看到多长时间以及多远。

局部变量:作用域仅在函数内部。 它位于RAM的STACK区域中。 这意味着每次调用一个函数时,该函数的所有变量(包括函数参数)都会重新创建,并在控件退出该函数后销毁。 (因为每次函数返回时堆栈都会被刷新)

静态变量:此范围适用于文件。 它可以在文件中的任何位置访问

在其中声明。 它位于RAM的DATA段中。 由于只能在文件内部进行访问,因此只能进行内部链接。 任何

其他文件看不到该变量。 实际上,STATIC关键字是我们可以引入某些级别的数据或功能的唯一方法

隐藏在“ C”中

全局变量:此范围适用于整个应用程序。 它可以从应用程序的任何位置访问。 全局变量也驻留在DATA段中,因为可以在应用程序中的每个位置访问它,因此可以进行EXTERNAL链接

默认情况下,所有功能都是全局的。 如果需要从外部隐藏文件中的某些功能,则可以在该功能的前面加上static关键字。 :-)

#5楼

在谈论这个问题之前,最好准确地了解术语翻译单元 , 程序和C ++的一些基本概念 (实际上,链接通常是其中之一)。 您还必须知道什么是范围 。

我会强调一些要点,特别是。 先前答案中缺少的那些。

链接是名称的属性,由声明引入。 不同的名称可以表示相同的实体 (通常是对象或函数)。 因此,谈论实体的链接通常是胡说八道,除非您确定该实体将仅由某些特定声明(不过通常是一个声明)中的唯一名称引用。

请注意, 对象是实体,但变量不是。 在讨论变量的链接时,实际上要关注所表示实体的名称(由特定声明引入)。 名称的链接是以下三种之一:无链接,内部链接或外部链接。

不同的翻译单元可以通过头文件/源文件共享相同的声明(是的,这是标准的措词)。 因此,您可以在不同的翻译单位中使用相同的名称。 如果声明的名称具有外部链接,则该名称引用的实体的身份也将共享。 如果声明的名称具有内部链接,则不同翻译单位中的相同名称表示不同的实体,但是您可以在同一翻译单位的不同范围内引用该实体。 如果名称没有链接,则根本无法从其他范围引用该实体。

(糟糕...我发现我键入的内容只是在重复标准措辞 ...)

语言规范中还没有涵盖其他一些令人困惑的地方。

可见性(名称)。 它也是声明名称的属性,但其含义不同于linkage 。

可见性(副作用) 。 这与本主题无关。

(符号的)可见性。 实际实现可以使用此概念。 在这样的实现中,在目标(二进制)代码中具有特定可见性的符号通常是从实体定义映射的目标,该实体定义的名称在源(C ++)代码中具有相同的特定链接。 但是,通常不能保证一对一。 例如,动态库映像中的符号只能从源代码(涉及某些扩展,通常是__attribute__或__declspec )或编译器选项在内部在该映像中指定,并且该映像不是整个程序或目标文件从翻译单元翻译过来的,因此没有标准的概念可以准确地描述它。 因为符号不是C ++中的规范术语,所以它仅是实现细节,即使方言的相关扩展可能已被广泛采用。

辅助功能。 在C ++中,这通常是关于类成员或基类的属性的 ,这又是与主题无关的不同概念。

全球。 在C ++中,“全局”是指全局名称空间或全局名称空间范围的内容。 后者大致相当于C语言中的文件范围 。 在C和C ++中,链接都与范围无关,尽管范围(如链接)也与某些声明引入的标识符(在C中)或名称(在C ++中)紧密相关。

名称空间范围const变量的链接规则是特殊的(特别不同于C语言中在文件范围中声明的const对象,该对象也具有标识符链接的概念)。 由于ODR是由C ++强制执行的, 因此对于整个程序中发生的同一变量或函数,除了inline函数外,不要超过一个定义 , 这一点很重要 。 如果没有这样特殊的const规则,则最简单的const变量声明在多个翻译单元(或一个翻译单元包含)的头文件或源文件(通常是“头文件”)中带有初始化程序(例如= xxx )程序中会多次(尽管很少)违反ODR,这使得无法使用const变量替换某些类似于对象的宏。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值