在c ++中使用extern

时间:2013-04-05 19:00:34

标签: c++ extern

我很难理解'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)

2 个答案:

答案 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;链接时出错。