logo search
Подбельский Фомин_Программирование на языке СИ_

Внешние объекты.

Внешние объекты. Здесь в конце главы, посвященной функциям, самое подходящее время, чтобы взглянуть в целом на программу, состоящую из набора функций, размещенных в нескольких текстовых файлах. Именно такой вид обычно имеет более или менее серьезная программа на языке Си. Отдельный файл с текстами программы иногда называют программным модулем, но нет строгих терминологических соглашений относительно модулей или файлов с текстами программы. На рис. 5.3 приведена схема программы, текст которой находится в двух файлах. Программа, как мы уже неоднократно говорили, представляет собой совокупность функций. Все функции внешние, так как внутри функции по правилам языка Си нельзя определить другую функцию. У всех функций, даже размещенных в разных файлах, должны быть различные имена. Одинаковые имена функций должны относиться к одной и той же функции.

Кроме функций, в программе могут использоваться внешние_объекты - переменные, указатели, массивы и т.д. Внешние объекты должны быть определены вне текста функций.

Внешние объекты могут быть доступны из многих функций программы, однако эта доступность не всегда реализуется автоматически - в ряде случаев нужно дополнительное вмешательство программиста. Если объект определен в начале файла с программой, то он является глобальным для всех функций, размещенных в файле, и доступен в них без всяких дополнительных предписаний. (Ограничение - если внутри функции имя глобального объекта использовано в качестве имени внутреннего объекта, то внешний объект становится недостижимым, т.е. "невидимым" в теле именно этой функции.) На рис. 5.3:

• объект X: доступен в fl 1( ), f!2( ) как глобальный; доступен как внешний в файле 2 только в тех функциях, где будет помещено описание extern X;

• объект Y: доступен как глобальный в f21( ) и f22( ); доступен как внешний в тех функциях файла 1, где будет помещено описание extern Y;

• объект Z: доступен как глобальный в f22( ) и во всех функциях файла 1 и файла 2, где помещено описание extern Z.

Рис. 5.3. Схема программы, размещенной в двух файлах

Если необходимо, чтобы внешний объект был доступен для функций из другого файла или функций, размещенных выше определения объекта, то он должен быть перед обращением дополнительно описан с использованием дополнительного ключевого слова extern. (Наличие этого слова по умолчанию предполагается и для всех функций, т.е. не требуется в их прототипах.) Такое описание, со спецификатором слова extern, может помещаться в начале файла, и тогда объект доступен во всех функциях файла. Однако это описание может быть размещено в теле одной функции, тогда объект доступен именно в ней.

Описание внешнего объекта не есть его определение. Помните: в определении объекту всегда выделяется память, и он может быть инициализирован. Примеры определений:

В описаниях инициализация невозможна, нельзя указать и количество элементов массивов:

Содержательные примеры, иллюстрирующие особенности применения внешних объектов в "многофайловых" программах, приведены в главе 8.