- Внешние функции и переменные
- Работа
Внешние функции и переменные
По отношению к текущему модулю все переменные и функции из других модулей считаются внешними, т.е. недоступными. Если необходимо использовать эту внешнюю переменную, ее нужно объявить в модуле с указанием ключевого слова extern:
extern int Cnt;
Пример показывает объявление внешней переменной Cnt. При компиляции такой программы компилятор зарезервирует адрес этой переменной, не определяя его конкретное значение, а компоновщик при сборке загружаемого файла будет осуществлять поиск во всех модулях объявление переменной Cnt и, если найдет, присвоит значение ее адресу. Таким образом, внешние переменные становятся доступны в модуле лишь после компоновки.
Для обращения к функции из другого модуля в большинстве случаев не требуется указания служебного слова extern - достаточно простого наличия ее объявления в подключаемом заголовочном файле, действия компоновщика при этом аналогичны рассмотренным. Иное дело, если функция определена, но исходного текста соответствующего модуля нет. Такая ситуация возможна, если вместо исходного текста модуля имеется объектный файл. В этом случае объектный файл включается в обработку компоновщиком, и для объявленной функции использование ключевого слова extern является обязательным.
Иными словами, слово extern означает, что адрес объекта должен быть найден не компилятором, а компоновщиком на основе содержимого объектных файлов, используемых для сборки проекта.
Излишне говорить, что фактический тип внешней переменной или функции должен совпадать с объявленным, а для функций еще должны совпадать типы и количество параметров. Так как на этапе компоновки уже нет возможности точно сверить соответствие фактической реализации объявлению, несоблюдение этого правила чревато крупными проблемами. Обычно, в этом случае генерируется лишь предупреждение, а не ошибка.