关于C ++:C ++ – 对extern关键字感到困惑

C++ - confused about the extern keyword

本问题已经有最佳答案,请猛点这里访问。

所以我试图理解它以及它的用途,我得到了一个声明变量和定义变量之间的区别。

我将尝试解释在使用本教程中的示例时所困惑的问题。

例1:

1
2
3
4
5
6
extern int var;
int main(void)
{
var = 10;
return 0;
}

所以在这里我得到,你不能将var赋给10,因为没有内存分配给它。

例2:

1
2
3
4
5
6
7
#include"somefile.h"
extern int var;
int main(void)
{
var = 10;
return 0;
}

我在这里迷路了。somefile.h的值应该是int var=0;声明它正确吗?但是,为什么这个程序会再次声明它呢?


强制性要点1:这与全局变量有关,因此您真正需要/想要做的第一件事不是学习如何使用它们,而是如何避免它们。它们比解决方案更容易导致问题。

也就是说,至少在通常情况下,您在头中放置了一个extern声明。将变量的定义放在一个源文件中,并将头包含在需要访问该变量的任何其他文件中。

例如:

1
2
//file1.cpp:
int var;

然后,声明变量的头:

1
2
//file1.h:
extern int var;

然后在一个需要访问变量的文件中:

1
2
3
4
5
#include"file1.h"

int main() {
    var = 10; // Yes, this *is* allowed
}

…在另一个需要访问变量的文件中:

1
2
3
#include"file1.h"

int f() { return var; }

不过,我再重复一遍:这几乎是不必要或不可取的。如果你真的经常使用Globals,那么你可能做错了什么(我习惯每年使用一次Global,所以我不会忘记它是如何使用的,但至少有几年没有使用过其他的方法)。


extern实际上意味着在所有链接的obj文件/库中的某个地方(在您的例子中)存在一个名为"in t类型的var"的变量,编译器不知道在哪里,但他会让链接器为您找到它。这让编译器很高兴。

在您的例子中,您是对的,必须在某个地方定义"in t var=1";,实际上,在Ccpp文件中,而不是在头文件中(如果它在头文件中,则不需要将其外部化,只需将其包含在内)。

如果你把一个变量外部化,但不在某个地方定义它,链接器就会不高兴——因为一个未解决的符号错误(即它的意思是"你告诉我要查找一个名为‘var’的变量,但我找不到它")。

因此-理论上,您不应该能够创建一个具有未定义的外部变量的可执行文件。


基本上,extern关键字告诉编译器/链接器它应该期望变量在程序的其他地方被实例化和定义,例如您链接到的库或任何对象文件"somefile.h"编译到的对象文件。extern让编译器和程序员"知道"一个变量,同时让另一段代码实际管理它。

下面是一个很好的外部解释:https://stackoverflow.com/a/496476/1874323