gpt4 book ai didi

c++ - 外部、链接和全局变量

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

在 C++ 中,假设我们有这个头文件:

myglobals.h

#ifndef my_globals_h
#define my_globals_h

int monthsInYear = 12;

#endif

并且我们将它包含在多个实现文件中,然后我们将得到编译错误,因为我们最终定义了多次“monthsInYear”,每个包含 monthsInYear 的文件一次。

很好。因此,如果我们修改我们的 header 并使我们的全局常量,如下所示:

const int monthsInYear = 12;

然后我们的编译错误就消失了。对此的解释,据我所知,并给出here for example ,这里的 const 关键字将 monthsInYear 的链接更改为内部链接,这意味着现在包含 header 的每个编译单元现在都有自己的具有内部链接的变量拷贝,因此我们不再有多个定义。

现在,另一种方法是仅使用 extern 在 header 中声明变量,即:

extern int monthsInYear;

然后在包含 header 的实现文件之一中定义它,即:

#include "myglobals.h"
...
int monthsInYear = 12;
...

然后所有包含它的地方都在处理一个具有外部链接的变量。

这很好,但我有点困惑的是,使用 const 为其提供内部链接,这解决了问题,而使用 extern 为其提供了外部链接,这也解决了问题!这就像说任何链接都可以,只要我们指定它。最重要的是,当我们刚刚写的时候:

int monthsInYear = 12;

链接不是已经在外部了吗?这就是为什么添加“const”更改到内部的链接?

在我看来,在这里使用“extern”实际上解决了问题的原因不是因为它给了我们外部链接(我们已经有了),而是因为它允许我们仅声明变量 而无需定义它,否则我们将无法做到,因为:

int monthsInYear = 12;

都声明了 定义了它,并且由于包含 header 有效地将代码复制粘贴到实现文件中,我们最终得到了多个定义。相反,由于 extern 只允许我们声明它,所以我们每次包含 header 时都会有多个声明,这很好,因为我们可以有多个声明,但不能有多个定义。

我的理解对吗?很抱歉,如果这非常明显,但 extern 似乎至少做了三件事:

  • 指定外部链接
  • 允许声明对象而不定义它们
  • 指定静态存储期限

但是我看的很多资料都没有说清楚,在谈论使用 extern 来阻止全局变量的“多重定义”错误时,没有说清楚关键是将声明与定义。

最佳答案

对于非const 变量,extern 具有指定变量具有外部链接(这是默认设置)的效果,但它 如果没有初始值设定项,则将定义转换为声明 - 即 extern int i; 实际上并未定义 i。 (extern int i = 5; 会产生编译器警告)。

当你在多个源文件中写入 extern int monthsInYear;(或将其 #include 写入它们,这是等效的)时,它们都没有定义它。 int monthsInYear = 12; 仅定义该源文件中的变量。

关于c++ - 外部、链接和全局变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31667323/

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