gpt4 book ai didi

c++ - 内部链接和无链接之间的区别

转载 作者:可可西里 更新时间:2023-11-01 16:07:16 28 4
gpt4 key购买 nike

请引用以下同翻译单元的代码:

static int global_var; // file scope in C and global namespace scope in C++
// internal linkage
void f(void)
{
static int local_var; // block scope in C and local scope in C++
// no linkage
}

我的理解是这样的:

  • 我可以从翻译单元的任何地方引用 global_var,因为它具有全局范围。
  • 我只能在函数 f 中引用 local_var,因为它具有局部作用域。

我的问题:

  1. 这两个变量在链式方面有什么区别?
  2. 您能否提供一个示例,说明内部无链接会产生差异,并且差异不仅来自范围?

编辑

在 James Kanze 的回答和评论之后,我现在可以构建一个示例来显示内部链接属性和无链接属性之间的区别:

static int i; // definition
// static storage
// internal linkage

void f(void)
{
extern int i; // declaration
// refers to the static i at file scope
// note that even though the specifier is extern
// its linkage is intern (this is legal in both C/C++)
{
int i; // definition
// automatic storage
// no linkage
}
}


一些文章很好地解释了所涉及的概念:
- Scope regions in C and C++
- Storage class specifiers and storage duration
- Linkage in C and C++

最佳答案

第一:除了类型,变量还有另外三个特性:链接、范围和生命周期。所有四个属性有点正交,但以它们的方式链接以语言表达,并以某些方式进行交互。

关于链接:链接确实影响了符号正在声明,而不是对象本身。如果没有链接,符号的所有声明都绑定(bind)到不同的对象,例如:

int
func()
{
int i;
{
int i;
}
}

符号i没有链接,两个符号i是绑定(bind)的到两个不同的实体。一般来说,局部变量(在 block 范围内声明的变量)和函数参数有没有链接,无论类型和生命周期如何。

内部和外部链接是相似的,重复符号的声明绑定(bind)到同一个实体:内部链接仅在翻译单元内绑定(bind),外部交叉整个程序。所以给出:

static int i;   //  internal linkage...

在几个翻译单元中,i 绑定(bind)到一个单独的实体在每个翻译单元中。没有静电,你有外部链接,并且所有 i 都绑定(bind)到同一个实体。

请注意,这仅适用于命名空间范围; 所有实体属于非本地类的成员具有外部链接。

那个类型有一个影响:变量是 const隐式具有内部链接:

int const i = 42;    //  same as static int const i...
extern int const j = 42; // external linkage.

最后,绑定(bind)到同一实体的所有声明必须声明它具有相同的类型。如果您在单个翻译单元(例如:

extern int i;
// ...
double i;

在同一个命名空间范围内),那么编译器应该会报错。如果两个声明在不同的翻译单元中,然而,这是未定义的行为,谁知道会发生什么发生。 (理论上,链接器可能会提示,但大多数不会。)

编辑:

补充一点:联动是由第一个决定的可以引用实体的声明。所以如果我写:

static int i;

void
func()
{
extern int i;
}

i 指的是同一个实体,具有内部链接。(为什么有人会写第二个声明超出了我的范围,但这是合法的。)

关于c++ - 内部链接和无链接之间的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24864840/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com