Давайте рассмотрим все возможные случаи, потому что из вашего вопроса я тоже не уверен:
В качестве ключевого слова используется extern
.Чтобы понять это, вы должны понимать единицы компиляции.По сути, каждый файл представляет собой единицу компиляции, поэтому каждый .c
компилируется в .o
с заменой заголовков.В каждом модуле компиляции вы пересылаете объявления ожидаемых символов - например, функций, принадлежащих другим модулям компиляции.
Теперь, если вы объявляете глобальную переменную в одном файле .c
, это глобально, еслифайл, но вообще не существует как символ в каком-либо другом файле - компилятор выдаст ошибку, потому что он не знает, где была объявлена эта переменная.
(Конечно, если вы объявите переменную в заголовке- он будет существовать во всех объектах, в которые включен заголовок, и тогда компоновщик будет дуться, потому что, когда он связывает все объекты, некоторые символы будут иметь одинаковое имя).
Чтобы обойти это, можно определить переменную, например, с помощью extern int x;
.Это говорит о том, что компилятор a) int x
должен быть доступен для этого модуля компиляции, b) int x
не в этом модуле компиляции и c) компоновщик должен проверить, что он существует где-то во всех модулях, которые вы 'мы собрали вместе, чтобы сформировать библиотеку или программу.
Концептуально, вы делаете это все время с предварительным объявлением функций.Там просто нет возможности для вперед объявить переменную.На самом деле, вы можете делать это и с функциями и не беспокоиться о совместно используемых заголовках, хотя это не очень хорошая идея.
Другой случай - это "внешние переменные"означает что-то внешнее для определенной области или модуля, который у вас есть.Я бы очень внимательно проверил ваше задание и, если сомневался, спросил бы - кто бы его ни назначил, он сможет точно объяснить вам, что они означают.