Ответ 1
Объявление переменной в области пространства имен всегда является определением, если вы не нанесете на него extern
; то это просто объявление.
Важным правилом в С++ является то, что вы не можете иметь несколько определений объектов с тем же именем. Если в файле заголовка содержится double LIST1[100][100];
, это будет работать до тех пор, пока вы только включили его в одну единицу перевода. Но как только вы включаете файл заголовка в несколько единиц перевода, вы имеете несколько определений LIST1
. Вы нарушили правило!
Итак, чтобы иметь глобальную переменную, доступную из нескольких единиц перевода, вам нужно убедиться, что в файле заголовка есть только объявление. Мы делаем это с помощью extern
:
extern double LIST1[100][100];
Однако вы не можете просто включить заголовок и попытаться использовать этот объект, потому что пока нет определения. Это объявление LIST1
просто говорит, что массив этого типа существует где-то, но нам действительно нужно определить его для создания объекта. Поэтому в одной единице перевода (обычно в одном из ваших файлов .cpp
) вам нужно будет поставить:
double LIST1[100][100];
Теперь каждый из ваших файлов .cpp
может включать заголовочный файл и только когда-либо получать декларацию. Это прекрасно, чтобы иметь несколько деклараций в вашей программе. Только одно из ваших файлов .cpp
будет иметь это определение.