2013-04-05 93 views
15

我很难理解'extern'是如何工作的。 我已经搜索谷歌,但似乎并没有特定的例子,我想在C++中使用extern

如果我有一个文件main.cpp其中引用one.h ,并在它我有一个名单LIST1(这是一个双100×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> main.obj:错误LNK2001:解析外部符号 “双(* LIST1)[100]”(LIST1 @@ @ 3PAY0GE NA?)

+1

你能否清楚地说明你在哪个文件中有哪些代码。你目前的描述相当混乱。 – NPE 2013-04-05 19:02:25

+1

并定义“不工作” – infiniteRefactor 2013-04-05 19:04:34

+0

'LIST1 [j,i] = 0.5;'也应该给出一个错误 - 你的意思是'LIST1 [j] [i] = 0.5;' – 2015-03-26 19:42:20

回答

21

在C++中,与之前的C一样,每个源文件都被编译为一个对象文件。然后链接所有的目标文件来创建可执行程序。

要共享符号(函数,全局变量),有几个关键字告诉编译器哪些文件是本地的,哪些是私有的,哪些是从其他文件导入的。

'extern'关键字表示符号可以被访问,但没有被定义。它应该在其他模块中定义(作为全局)。如果没有,链接时会出现“未定义符号”错误。

29

命名空间范围内的变量声明始终是定义,除非您将extern放在上面;那么这只是一个声明。

C++中的一个重要规则是不能有多个具有相同名称的对象的定义。如果您的头文件只包含double LIST1[100][100];,只要您只将它包含在一个翻译单元中,就可以工作。但是,只要将头文件包含在多个翻译单元中,就有多个定义LIST1。你违反了规则!

因此,要从多个翻译单元访问全局变量,您需要确保头文件中只有一个声明。我们这样做是与extern

extern double LIST1[100][100]; 

但是,你不能只包括头和尝试,因为没有一个定义尚未使用这个对象。这个LIST1声明只是说这个类型的数组存在某个地方,但我们实际上需要定义它来创建该对象。因此,在一个单一的翻译单元(通常是您.cpp文件之一),你将需要把:

double LIST1[100][100]; 

现在,每个.cpp文件可以包含头文件,并永远只拿到申报。在你的程序中有多个声明是很好的。只有其中一个.cpp文件将具有此定义。