Главная страница Случайная страница КАТЕГОРИИ: АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника |
Область видимости и период жизни.
Ø В одномодульном программировании организация связи между инструментами решения задач базируется на понятии «локальные-глобальные», а для оформления этого понятия используется принцип вложенности программных компонентов: § в Pascal используются возможности вложенного описания процедур и функций; § в С/С++ - возможности вложенного использования оператора блок. Инструменты (переменные, функции...), локализованные в программном компоненте (в процедуре-функции, в блоке), не видимы извне, но видят тех, кто для них глобален (объявлен в объемлющей области). Можно перекрыть возможность видеть то, чего «не хочется видеть» - если имя «возможно глобального» совпадает с именем локального, этот «возможно глобальный» становится не видимым, возможность перекрывается. Что-то новое появляется в дилемме локальные – глобальные, когда базовое понятие «переменная» расширяется понятием «динамическая переменная», потому как динамические переменные не описываются, а явно создаются и уничтожаются в периоде выполнения программ. Отметим, что понятие «локальные-глобальные» относительное – локальное для данного программного компонента является глобальным для вложенного в него программного компонента, с другой стороны – каждое глобальное для программного компонента должно быть локализовано в одном из объемлющих его. В программе обычно имеются максимальноглобальные инструменты, локализованные на самом верхнем уровне вложенности, т.е. объявленные вне процедур-функций. Отметим, что сами функции в С/С++ всегда максимальноглобальны. С другой стороны, семантика понятия «локальные-глобальные» базируется на понятиях область видимости и период жизниимени или иначе, инструмента, который идентифицируется этим именем – в таблице 1 на следующей странице систематизировано соотношение понятий «локальные» и «глобальные» инструменты и их «область видимости» и «период жизни». Ø В многомодульном программировании ситуация усложняется в связи с тем, что: § модули не вкладываются, а оформляются раздельно, § раздельная трансляция накладывает свои требования на организацию связи между модулями. ¨ Организация связи между инструментами внутри модуля основана на тех принципах, которые рассмотрены для одномодульного программирования. ¨ Организация межмодульной связи. Для оформления связей и защиты инструментов модуля в C/C++ используются средства управления областью видимости и периодом жизни инструментов: § модификаторы класса памяти: static, extern – ключевые слова ставятся в начале объявления переменной или заголовка описания функции; § прототип функции: заголовок её описания. Теперь рассмотрим оформление инкапсулированных и интерфейсных инструментов и импорта инструментов. В таблице 2 на следующей странице систематизировано соотношение этих понятий, их областей видимости и периодов жизни, а также способов оформления импорта-экспорта в Object Pascal 2 (OP2) и С/С++.
Таблица 1. Организация внутримодульной связи, область видимости и период жизни инструмента.
Таблица 2. Организация межмодульной связи, область видимости и период жизни инструмента. Инкапсулированные (неимпортируемые) инструменты модуля: § Инструменты, локализованные в блоках описания функций, импортировать невозможно, они невидимы даже в своём модуле за пределами области их видимости. § Только максимальноглобальные инструменты модуля (программного файла) можно импортировать, т.е. только те, которые объявлены вне описаний функций. § Для инкапсуляции инструмента (защиты от импорта) в начале его объявления ставится ключевое слово static. Модификатор класса памяти static допустим только для переменных, констант и функций, т.е. защитить определение типа от импорта невозможно. Попытка импорта инкапсулированного инструмента пресекается на этапе редактирования межмодульных связей после трансляции всех модулей многомодульной программы. Модификатор класса памяти static применим и к локальным переменным. Как показано в таблице 2 на предыдущей странице, воздействие модификатора static на глобальные и локальные переменные заметно различается. Для глобальных переменных – он сужает область видимости (но не изменяет период жизни), а для локальных – расширяет период жизни (но не изменяет область видимости). Локальные static-переменные - это что-то новое в дилемме локальные - глобальные. При выходе из своего блока, области видимости этой переменной, она не уничтожается, как это происходит с обычной локальной переменной, и сохраняет своё значение. А потому при повторном входе в свой блок восстанавливается её последнее значение от предыдущего входа в этот блок. Интерфейсные (экпортируемые) инструменты модуля: § Импортировать можно любой максимальноглобальный инструмент модуля, не защищённый модификатором static в его объявлении. Импорт инструментов модуля: Импортирование оформляется в импортирующем модуле повторным объявлением инструмента, а точнее ссылкой на основное собственно объявление этого инструмента в экспортирующем модуле: § Импорт функции: включить (в импортирующий модуль) прототип этой функции. Можно в начало прототипа поставить ключевое слово extern, но этот модификатор класса памяти для функций устанавливается по умолчанию. § Импорт переменной: включить объявление этой переменной, но с модификатором extern (в начале объявления) и без инициализации. § Импорт константы: оформляется аналогично, но в определении константы обязательно опускается определяющая часть = значение § Импорт типа: оформляется полным повторным объявлением. Повторные объявления – опасная штука, могут появиться расхождения в этих объявлениях и сопутствующие им недоразумения... Чтобы оградить программиста от технических проблем, сопутствующих повторным объявлениям, в С/С++ используется понятие «заголовочный h-файл» и директива препроцессорных средств #include: § В заголовочный h-файл включается весь импорт модуля. § #include ИмяФайлаОбрамлённое Эта директива имеет следующий смысл: заменить текст директивы текстом файла, имя которого указано в директиве. Если параметр директивы задан в виде < ИмяФайла >, то файл ищется в предопределенном каталоге среды программирования, а если в виде строковой константы ” ИмяФайла ” – то в текущем каталоге проекта. Директивы препроцессорных средств обрабатываются препроцессором до трансляции модуля. Ø Вариант 1. С/С++. Статическая реализация стека. На следующей странице приведена С/С++-программа статической реализации стека вместе с выше рассмотренной Pascal-программой для визуального сравнения.
UNIT UVal; INTERFACE TYPE TVal= CHAR; PROCEDURE WriteElement(xPrm: TVal); CONST CMaxL=1000 {статическая реализация - размер стека изначально ограничен};
|