对extern关键字感到困惑
这个问题在这里已经有了答案:
强制性要点#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; }
但我会重复一遍:这几乎是不必要或不可取的。 如果你实际上经常使用全局变量,那么你可能做错了事情(我每年使用一次全局变量是一种做法,所以我不会忘记它是如何的,但至少在我数年后使用任何其他)。
基本上,extern关键字告诉编译器/链接器它应该期望变量被实例化并在程序的其他地方定义,例如你正在链接的库或任何目标文件“somefile.h”编译的目录。 Extern让编译器和程序员“知道”一个变量,同时让另一段代码实际管理它。
这里是extern的一个很好的解释:https://stackoverflow.com/a/496476/1874323
extern有效地意味着在某个地方,在所有链接的obj文件/库中都存在一个变量(在你的情况下)称为“var类型为int,编译器不知道在哪里,但他会让链接器为你找到它” 。 这可以让编译器高兴。
在你的情况下,你是对的,'int var = 1;' 必须在ac cpp文件的某个地方定义,而不是一个标题(如果它在标题中,则不需要extern,只需#include即可)。
如果你在外部存在一个变量,但是没有在某个地方定义它,链接器将会变得不快乐 - 带有未解决的符号错误(例如,它说“你告诉我寻找一个名为'var'的变量,但是我找不到它)。
因此 - 理论上,您不应该能够使用未定义的extern'd变量创建可执行文件。
链接地址: http://www.djcxy.com/p/40491.html