Использование extern в С++

Мне трудно понять, как работает "extern". Я искал Google, но, похоже, не какой-то конкретный пример, который я пытаюсь

Если у меня есть файл 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)

Ответы

Ответ 1

Объявление переменной в области пространства имен всегда является определением, если вы не нанесете на него extern; то это просто объявление.

Важным правилом в С++ является то, что вы не можете иметь несколько определений объектов с тем же именем. Если в файле заголовка содержится double LIST1[100][100];, это будет работать до тех пор, пока вы только включили его в одну единицу перевода. Но как только вы включаете файл заголовка в несколько единиц перевода, вы имеете несколько определений LIST1. Вы нарушили правило!

Итак, чтобы иметь глобальную переменную, доступную из нескольких единиц перевода, вам нужно убедиться, что в файле заголовка есть только объявление. Мы делаем это с помощью extern:

extern double LIST1[100][100];

Однако вы не можете просто включить заголовок и попытаться использовать этот объект, потому что пока нет определения. Это объявление LIST1 просто говорит, что массив этого типа существует где-то, но нам действительно нужно определить его для создания объекта. Поэтому в одной единице перевода (обычно в одном из ваших файлов .cpp) вам нужно будет поставить:

double LIST1[100][100];

Теперь каждый из ваших файлов .cpp может включать заголовочный файл и только когда-либо получать декларацию. Это прекрасно, чтобы иметь несколько деклараций в вашей программе. Только одно из ваших файлов .cpp будет иметь это определение.

Ответ 2

В С++, как и C перед ним, каждый исходный файл скомпилирован в объектный файл. Затем все объектные файлы связаны с созданием исполняемой программы.

Для обмена символами (функциями, глобальными переменными) есть несколько ключевых слов, которые сообщают компилятору, которые являются локальными для файла, которые являются частными и которые импортируются из другого файла.

Ключевое слово `extern 'означает, что доступ к символу возможен, но не определен. Он должен быть определен (как глобальный) в каком-либо другом модуле. Если нет, вы получите сообщение об ошибке "undefined" в момент времени.