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

时间:2014-08-07 23:43:15

标签: c++ extern

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

我将尝试解释在使用教程中的示例时我感到困惑的内容。

示例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的东西;要声明它是否正确?那么为什么这个程序会再次声明呢?

3 个答案:

答案 0 :(得分:1)

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

那就是说,至少在通常的情况下,你在标题中放了一个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; }

我会重复一遍:这几乎不是必要或不可取的。如果你实际上经常使用全局变量,那么你可能做错了(我做了一次每年使用一次全局的练习所以我不会忘记怎么做,但是至少我已经有几年了使用除此之外的任何其他。)

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

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

在你的情况下,你说得对,'int var = 1;'必须在某个地方定义,实际上,在c \ cpp文件中,而不是标题(如果它在标题中,你不需要外部它,你可以#include它)。

如果你是extern一个变量,但是没有在某个地方定义它,那么链接器就会变得不快 - 有一个未解决的符号错误(即它说“你告诉我要找一个名为'var'的变量,但我可以'找到它。)

所以 - 理论上,您不应该使用未定义的extern'd变量创建可执行文件。