Традиционно, глобальные переменные объявлены в заголовке и определены в исходном файле.Другие исходные файлы должны знать только то, как он объявлен, чтобы использовать его (то есть его тип и имя).Пока переменная определена где-то в исходном файле, компоновщик сможет найти ее и соответствующим образом связать все ссылки в других исходных файлах с определением.
Где-то в вашем файлеВ заголовке вы бы объявили глобальную переменную, подобную этой:
extern int GlobalInt;
Часть extern
сообщает компилятору, что это всего лишь объявление о существовании объекта типа int
, идентифицируемого GlobalInt
.Это может быть определено позже или не может (компилятор не несет ответственности за его существование, это работа компоновщика).В этом отношении он аналогичен прототипу функции.
В одном ваших исходных файлов вы определяете GlobalInt
целое число:
int GlobalInt = 4;
Теперь каждыйфайл, включающий заголовок, будет иметь доступ к GlobalInt
, поскольку заголовок говорит, что он существует, поэтому компилятор доволен, и компоновщик увидит его в одном из ваших исходных файлов, поэтому он тоже будет счастлив.Только не определяйте это дважды!
Однако
Вы должны подумать, полезен ли этот подход.Глобальные переменные становятся беспорядочными по ряду причин (пытаясь точно определить, где они определены или объявлены, возникают проблемы с потоками), глобальные переменные обычно не нужны.Возможно, вам следует рассмотреть возможность использования одноэлементного подхода.