繁体   English   中英

在c ++中使用extern

[英]The usage of extern in c++

我很难理解'extern'是如何工作的。 我搜索过谷歌,但似乎没有我正在尝试的具体案例

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

命名空间范围内的变量声明总是一个定义, 除非你把extern放在它上面; 那它只是一个宣言。

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

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

extern double LIST1[100][100];

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

double LIST1[100][100];

现在,每个.cpp文件都可以包含头文件,并且只能获得声明。 在你的程序中有多个声明是完全没问题的。 只有一个 .cpp文件具有此定义。

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

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

`extern'关键字表示可以访问符号,但不能定义。 它应该在某些其他模块中定义(作为全局)。 如果没有,您在链接时会收到“未定义的符号”错误。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM