16

我很难理解“外部”是如何工作的。我搜索了谷歌,但似乎没有我正在尝试的特定示例

如果我有一个引用 one.h 的文件 main.cpp 并且在其中我有一个名为 LIST1 的列表(它是一个 100 x 100 的双精度数组),那么我有一个双精度 List1[100][100];

请问如何在 one.cpp 中使用此列表?

extern double LIST1[100][100]

不管用 :/

主.cpp:

#include "one.h"

extern double LIST1[100][100];

一个.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)

4

2 回答 2

31

A variable declaration at namespace scope is always a definition unless you put extern on it; then it's just a declaration.

An important rule in C++ is that you can't have multiple definitions of objects with the same name. If your header file just contained double LIST1[100][100];, this would work as long as you only ever included it in one translation unit. But as soon as you include the header file in multiple translation units, you have multiple definitions of LIST1. You've broken the rule!

So to have a global variable accessible from multiple translation units, you need to make sure there is only a declaration in the header file. We do this with extern:

extern double LIST1[100][100];

However, you cannot just include the header and try to use this object because there isn't a definition yet. This LIST1 declaration just says that an array of this type exists somewhere, but we actually need to define it to create the object. So in a single translation unit (one of your .cpp files usually), you will need to put:

double LIST1[100][100];

Now, each of your .cpp files can include the header file and only ever get the declaration. It's perfectly fine to have multiple declarations across your program. Only one of your .cpp files will have this definition.

于 2013-04-05T19:05:29.903 回答
22

In C++, like C before it, each source file is compiled to an object file. Then all the object files are linked to create the executable program.

To share symbols (functions, global variables), there are several keywords that tell the compiler which are local to the file, which are private, and which are imported from other file.

The `extern' keyword means that a symbol can be accessed, but not defined. It should be defined (as a global) in some other module. If not, you get an 'undefined symbol' error at link time.

于 2013-04-05T19:04:57.040 回答