The usage of extern in c++

Lilz picture Lilz · Apr 5, 2013 · Viewed 25.6k times · Source

I've having difficulty understanding how 'extern' works. I've searched Google but there doesn't seem to be the particular example case I'm trying

If i have a file main.cpp which references one.h and in it i have a list named LIST1 (which is a double array of 100 x 100) so I have double List1[100][100];

how can i use this list in one.cpp please?

extern double LIST1[100][100]

is not working :/

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;
    }
 }
}

This is what I have.

Error I'm getting:

1>main.obj : error LNK2001: unresolved external symbol "double (* LIST1)[100]" (?LIST1@@3PAY0GE@NA)

Answer

Joseph Mansfield picture Joseph Mansfield · Apr 5, 2013

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.