c++ -对extern关键字感到困惑

C++ - confused about the extern keyword

本文关键字:关键字 extern c++      更新时间:2023-10-16

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

我将尝试使用教程中的示例来解释我所困惑的地方。

示例1:

extern int var;
int main(void)
{
var = 10;
return 0;
}

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

示例2:

#include "somefile.h"
extern int var;
int main(void)
{
var = 10;
return 0;
}

我迷路了。somefile。h会用int var = 0来声明它是正确的?但是为什么这个程序要再次声明它呢?

强制性的第一点:这与全局变量有关,所以你真正需要做的第一件事不是学习如何使用它们,而是如何避免使用它们。它们更有可能导致问题而不是解决问题。

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

例如:

//file1.cpp:
int var;

然后是声明变量的头文件:

//file1.h:
extern int var;

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

#include "file1.h"
int main() {
    var = 10; // Yes, this *is* allowed
}

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

#include "file1.h"
int f() { return var; }

我要重复一遍:这几乎从来都不是必要的或可取的。如果你实际上经常使用全局变量,你可能做错了什么(我每年使用一次全局变量,这样我就不会忘记如何使用全局变量,但我至少有几年没有使用过其他全局变量了)。

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

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

extern有效地意味着在某个地方,在所有链接的obj文件/库中存在一个变量(在你的情况下),称为"var的int类型,编译器不知道在哪里,但他会让链接器为你找到它"。这让编译器很高兴。

在你的情况下,你是对的,'int var=1;'必须在某个地方定义,实际上,在ccpp文件中,而不是在头文件中(如果它在头文件中,你不需要extern它,你可以#include它)。

如果你外接了一个变量,但没有在某个地方定义它,链接器会因为一个无法解决的符号错误而不高兴(即它说"你告诉我要寻找一个名为'var'的变量,但我找不到它)。

所以-理论上,你不应该能够创建一个可执行文件与外部变量没有定义