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:这与全局变量有关,因此您真正需要/想要做的第一件事不是学习如何使用它们,而是如何避免它们。它们比解决方案更容易导致问题。
也就是说,至少在通常情况下,您在头中放置了一个
例如:
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