[英]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.