的extern的在C ++使用(The usage of extern in c++)

2019-08-19 21:58发布

我难以理解如何“的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)

Answer 1:

在命名空间范围变量声明总是一个定义,除非你把extern就可以了; 那么它只是一个声明。

在C ++中的一个重要规则是,你不能有相同的名字对象的多个定义。 如果你的头文件只是包含double LIST1[100][100]; ,这会只要你永远只包括它在一个翻译单元的工作。 但只要您在多个翻译单位的头文件,你有多重定义LIST1 。 你已经打破了规则!

所以有从多个翻译单元存取的全局变量,你需要确保只有在头文件中的声明。 我们这样做是与extern

extern double LIST1[100][100];

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

double LIST1[100][100];

现在,每个中.cpp文件可以包含头文件,并永远只拿到申报。 这是完全正常的跨越你的程序有多个声明。 只有你一个 .cpp文件都会有这样的定义。



Answer 2:

在C ++中,如C在它之前,每个源文件编译成目标文件。 然后,所有的目标文件链接到创建可执行程序。

要共享的符号(函数,全局变量),有几个关键字,告诉编译器这是本地的文件,这是私人的,并从其他文件都是进口的。

所述`的extern”关键字意味着一个符号可以被访问,而不是限定。 它应该在其他模块定义(作为一个全球性的)。 如果没有,你在链接时一个“未定义的符号”错误。



文章来源: The usage of extern in c++
标签: c++ extern