我难以理解如何“的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)
在命名空间范围变量声明总是一个定义,除非你把extern
就可以了; 那么它只是一个声明。
在C ++中的一个重要规则是,你不能有相同的名字对象的多个定义。 如果你的头文件只是包含double LIST1[100][100];
,这会只要你永远只包括它在一个翻译单元的工作。 但只要您在多个翻译单位的头文件,你有多重定义LIST1
。 你已经打破了规则!
所以有从多个翻译单元存取的全局变量,你需要确保只有在头文件中的声明。 我们这样做是与extern
:
extern double LIST1[100][100];
但是,你不能只包括头和尝试,因为没有一个定义尚未使用这个对象。 这LIST1
声明只是说,这种类型的数组存在于某个地方,但我们确实需要定义它来创建对象。 因此,在一个单一的翻译单元(您之一.cpp
通常文件),你将需要把:
double LIST1[100][100];
现在,每个中.cpp
文件可以包含头文件,并永远只拿到申报。 这是完全正常的跨越你的程序有多个声明。 只有你一个 .cpp
文件都会有这样的定义。
在C ++中,如C在它之前,每个源文件编译成目标文件。 然后,所有的目标文件链接到创建可执行程序。
要共享的符号(函数,全局变量),有几个关键字,告诉编译器这是本地的文件,这是私人的,并从其他文件都是进口的。
所述`的extern”关键字意味着一个符号可以被访问,而不是限定。 它应该在其他模块定义(作为一个全球性的)。 如果没有,你在链接时一个“未定义的符号”错误。