c++ -对extern关键字感到困惑
C++ - confused about the extern keyword
所以我试图理解它和它的用途,我得到了声明和定义变量之间的区别。
我将尝试使用教程中的示例来解释我所困惑的地方。
示例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/1874323extern有效地意味着在某个地方,在所有链接的obj文件/库中存在一个变量(在你的情况下),称为"var的int类型,编译器不知道在哪里,但他会让链接器为你找到它"。这让编译器很高兴。
在你的情况下,你是对的,'int var=1;'必须在某个地方定义,实际上,在ccpp文件中,而不是在头文件中(如果它在头文件中,你不需要extern它,你可以#include它)。
如果你外接了一个变量,但没有在某个地方定义它,链接器会因为一个无法解决的符号错误而不高兴(即它说"你告诉我要寻找一个名为'var'的变量,但我找不到它)。
所以-理论上,你不应该能够创建一个可执行文件与外部变量没有定义
- Visual Studio 2015:Extern "C" 和 "export" 关键字
- 如果全局变量默认是外部变量,为什么要添加"extern"关键字?
- C++17 'inline variable' vs 'extern' 关键字继承自 C 的新功能
- 对 C++ 中的特定标头使用 extern C 关键字是否允许从 void* 转换为 char*?
- extern 关键字在包含文件头文件C++
- 我应该在源文件之间共享的常量的定义中添加关键字"extern"吗
- 为什么我应该使用extern关键字来声明命名空间范围中的变量
- "extern"关键字用法
- 具有多个文件的extern关键字
- 正确使用"extern"关键字
- CppUTest中extern关键字的替代方案是什么
- 为什么C++编译器允许 extern 关键字与定义相结合
- C++ extern 关键字和全局变量
- 如何使用模板 extern 关键字分隔测试类型
- extern关键字在C++中的用法
- c++ -对extern关键字感到困惑
- 这里需要extern关键字,cpp文件中的const
- extern关键字和多个翻译单元的用法
- 在定义和声明中都指定extern关键字可以吗?
- C++:我无法理解"extern"关键字在我的程序中是如何工作的