sách gpt4 ai đã đi

Biến bên ngoài, liên kết và biến toàn cục

In lại 作者:可可西里 更新时间:2023-11-01 16:42:15 27 4
mua khóa gpt4 Nike

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

myglobals.h

#ifndef my_globals_h
#define my_globals_h

int monthsInYear = 12;

#kết thúc nếu

并且我们将它包含在多个实现文件中,然后我们将得到编译错误,因为我们最终定义了多次“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 来阻止全局变量的“多重定义”错误时,没有说清楚关键是将声明与定义。

1 Câu trả lời

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

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

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

27 4 0
可可西里
Hồ sơ cá nhân

Tôi là một lập trình viên xuất sắc, rất giỏi!

Nhận phiếu giảm giá Didi Taxi miễn phí
Mã giảm giá Didi Taxi
Giấy chứng nhận ICP Bắc Kinh số 000000
Hợp tác quảng cáo: 1813099741@qq.com 6ren.com