我很难理解'extern'是如何工作的。 我搜索过谷歌,但似乎没有我正在尝试的具体案例
如果我有一个引用one.h的文件main.cpp 在其中我有一个名为LIST1的列表(这是一个100 x 100的双数组) 所以我有两个List1 [100] [100];
我怎么能在one.cpp中使用这个列表?
extern double LIST1[100][100]
无效:/
main.cpp中:
#include "one.h"
extern double LIST1[100][100];
one.cpp:
void one::useList()
{
for(j = 0; j < 100; j++)
{
for(i = 0; i < 100; i++)
{
LIST1[j,i] = 0.5;
}
}
}
这就是我所拥有的。
我得到的错误:
1&gt; main.obj:错误LNK2001:未解析的外部符号“double(* LIST1)[100]“(?LIST1 @@ 3PAY0GE @ NA)
答案 0 :(得分:30)
命名空间范围内的变量声明始终是的定义,除非将extern
放在其上;那它只是一个宣言。
C ++中的一个重要规则是,您不能对具有相同名称的对象进行多种定义。如果您的头文件只包含double LIST1[100][100];
,只要您将其包含在一个翻译单元中,这就可以正常工作。但是,只要将头文件包含在多个翻译单元中,就会有多个LIST1
定义。你违反了规则!
因此,要从多个翻译单元访问全局变量,您需要确保头文件中只有一个声明。我们使用extern
执行此操作:
extern double LIST1[100][100];
但是,您不能只包含标题并尝试使用此对象,因为还没有定义。这个LIST1
声明只是说这个类型的数组存在于某个地方,但实际上我们需要定义它来创建对象。因此,在单个翻译单元(通常是您的.cpp
个文件之一)中,您需要输入:
double LIST1[100][100];
现在,您的每个.cpp
文件都可以包含头文件,并且只能获得声明。在你的程序中有多个声明是完全没问题的。只有一个的.cpp
文件才会有此定义。
答案 1 :(得分:22)
在C ++中,与之前的C一样,每个源文件都被编译为一个目标文件。然后链接所有目标文件以创建可执行程序。
要共享符号(函数,全局变量),有几个关键字告诉编译器文件是本地的,哪些是私有的,哪些是从其他文件导入的。
`extern&#39;关键字表示可以访问符号,但不能定义。它应该在某些其他模块中定义(作为全局)。如果没有,您将获得一个未定义的符号&#39;链接时出错。