|
Программирование >> Перегруженные имена функций и идентификаторы
Программирование со смешанными моделями и модификаторы адресации Borland C ++ вводит восемь новых ключевых слов, отсутствующих в языке Си стандарта ANSI (near, far, huge, cs, ds, es, ss и seg), которые с некоторыми ограничениями и предупреждениями могут использоваться в качестве модификаторов для указателей (и в некоторых случаях, для функций). В Borland C++ при помощи ключевых слов near, far или huge вы можете модифицировать объявления функций и указателей. Указатели данных near, far и huge рассматривались выше. Объекты far объявляются при помощи ключевого слова far. Функции near запускаются при помощи ближних вызовов (near), а выход из них происходит с использованием ближних команд возврата. Аналогичным образом, функции far вызываются дальними вызовами (far) и выполняют дальний (far) возврат. Функции huge похожи на функции far, за исключением того, что функции huge устанавливают регистр DS в новое значение, тогда как функции far не изменяют значения этого регистра. Существует также четыре специальных ближних (near) указателя данных: cs, ds, es и ss. Имеются 16-битовые указатели, конкретно связанные с соответствующими сегментными регистрами. Например, если вы объявите указатель следующим образом: char ss *p; то p будет содержать 16-битовое смещение в сегмент стека. Функции и указатели в данной программе по умолчанию бывают ближними или дальними, в зависимости от выбранной модели памяти. Если функция или указатель являются ближними, то они автоматически связываются с регистром CS или DS. В следующей таблице показано, как это происходит. Отметим, что размер указателя соответствует предельному размеру памяти, равному 64К (ближний, в пределах сегмента) или 1 Мб (дальний, содержит собственный адрес сегмента). Типы указателей
Указатели сегментов В объявлениях типа указателя сегмента используется seg. В результате получаются 16-битовые указатели сегментов. Синтаксис seg следующий: тип данных seg *идентификатор Например, int seg *name Любое обращение по сс1лке через идентификатор предполагает смещение 0. В арифметических операциях с указателями выполняются следующие правила: Нельзя использовать с указателями сегментов операции ++, --, +- ии -=. Нельзя вычитать один указатель сегмента из другого. При сложении сегментного указателя с ближним (near) указателем результатом будет дальний (far) указатель, который формируется из сегмента, задаваемого сегментным указателем, и смещения из ближнего указателя. Эта операция разрешена только в том случае, если два указателя указывают на один и тот же тип, либо если один из указателей указывает на тип void. Независимо от указываемого типа умножение смещения не происходит. Когда сегментный указатель используется в выражении обращения по ссылке, он также неявно преобразуется в дальний указатель. При выполнении операции сложения или вычитания целочисленного операнда и сегментного указателя результатом является дальний указатель, где сегмент берется из сегментного указателя, а смещение получается умножением размера объекта, на который указывает целочисленный операнд. Арифметическая операция выполняется таким образом, как если бы целое складывалось с указателем far или вычиталось из него. Сегментные указатели могут присваиваться, инициализироваться, передаваться в функции и из функций, сравниваться, и т.д. (Сегментные указатели сравниваются по правилам для unsigned int). Другими словами, за исключением перечисленных выше ограничений, они обрабатываются так же, как и любые другие указатели. Объявление дальних объектов Borland С++ позволяет объявлять дальние (far) объекты. Например: int far x = 5; int far z; extern int far y = 4; static long j; Компилятор Borland C++ создает для каждого дальнего объекта отдельный сегмент. Параметры компилятора командной строки -zE, -zF и -zH (которые могут также задаваться директивой #pragma option) влияют на имя, класс и группу дальнего сегмента, соответственно. Изменяя эти значения при помощи указания #pragma option, вы тем самым распространяете новые установки на все объявления дальних объектов. Таким образом, для создания в конкретном сегменте дальнего объекта, можно использовать следующую последовательность: #pragma option -zEmysegment -zHmygroup -zFmyclass int far x; #pragma option -zE* =zH* -zF* Тем самым x будет помещен в сегмент MYSEGMENT с классом MYCLASS в группе MYGROUP, после чего все дальние объекты будут сброшены в значения, используемые по умолчанию. Отметим, что при использовании этих параметров можно поместить несколько дальних объектов в один сегмент: #pragma option -zEcombined -zFmyclass int far x;
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |