Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Директивы компилятора. Переключатели. 
:(
    Опции темы
Fedor
Дата 20.4.2005, 17:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Днепрянин
****


Профиль
Группа: Участник
Сообщений: 2090
Регистрация: 8.2.2003
Где: Великий

Репутация: нет
Всего: 32



Использование директив компилятора в программе
Взято из справочной системы Borland Pascal 7.0 

Директивы компилятора - это комментарии со специальным синтаксисом. Они могут использоваться везде, где разрешены комментарии.

Директивы компилятора имеют следующий вид:
 - Начинаются со знаков "{$" или "(*$"
 - Сопровождаются именем директивы
 - Заканчиваются знаками "}" или "*)"

Например:
Код
{$I-}
{$A+}
(*$IFDEF VC70*)


Директивы компилятора делятся на три класса:
 1) Переключатели - Включают и выключают возможности компилятора, когда вы ставите знак "+" или "-" после имени директивы.
 2) Параметры - Определяют параметры, которые воздействуют на компиляцию.
 3) Условные директивы - Управляют условной компиляцией частей исходного текста.
 
Переключатели
Переключательные директивы включают и выключают возможности компилятора.

Они могут быть локальными или глобальными.
 - Локальные директивы могут находиться где-нибудь в теле программы. Они влияют только на часть компиляции.
 - Глобальные дирктивы должны находиться перед разделом описаний программы или модуля. Они влияют на всю компиляцию.

$A: Выравнивание данных
 ------------------------
Переключает между байтовым выравниванием и выравниванием по словам переменных и типизированных констант.

 Синтаксис:             {$A+} или {$A-}
 Значение по умолчанию: {$A+}
 Тип:                   Глобальная
 Команда меню:          Options|Compiler|Align Data

 Замечания:
Выравнивание по словам не дает эффекта на процессорах 8088.

На всех процессорах 80x86 выравнивание по словам задает более быстрое выполнение.
 - К данным размера "слово" (2 байта) по четным адресам можно обратиться за один цикл памяти.
 - К данным на нечетных адресах можно обратиться за два цикла памяти.

Состояние $A+:
В состоянии $A+, все переменные и типизированные константы размером больше 1-го байта располагаются по четным адресам.
При необходимости, между переменными могут быть вставлены неиспользуемые байты, для достижения выравнивания по словам.
Режим $A+ не влияет на переменные размером 1 байт, поля записей или элементы массивов.
Поле в записи будет выровнено по словам только в том случае, если полный размер всех полей до него является четным.
Чтобы каждый элемент массива был выровнен по словам, размер элементов массива должен быть четным.

Состояние $A-:
В состоянии $A-, выравнивание не происходит.

Переменные и типизированные константы просто помещаются в следующий доступный адрес памяти, независимо от их размера.

ВНИМАНИЕ: Независимо от состояния $A, каждый раздел описания глобальных переменных и констант всегда начинается на границе слов.
Компилятор всегда хранит указатель вершины стека (SP) выровненным по словам, рапределяя дополнительный неиспользуемый байт в записи активации процедуры если это требуется.

$B: Булева оценка
 ------------------
Переключает между двумя различными моделями генерации объектного кода для булевых операторов AND и OR.

 Синтаксис:             {$B+} или {$B-}
 Значение по умолчанию: {$B-}
 Тип:                   Локальная
 Команда меню:          Options|Compiler|Boolean Evaluation

Состояние $B+:
В состоянии $B+, компилятор генерирует код для полной булевой оценки выражения.
Это означает, что каждый операнд булева выражения, созданного при помощи операторов AND и OR, будет оценен, даже в том случае, если результат всего выражения уже известен.

Состояние $B-:
В состоянии $B-, компилятор генерирует код с короткой схемой оценки булевого выражения.
Это означает, что оценка выражения прекращается, как только результат всего выражения становится очевидным.

$D: Отладочная информация
 --------------------------
Включает или выключает генерацию отладочной информации.

 Синтаксис:             {$D+} или {$D-}
 Значение по умолчанию: {$D+}
 Тип:                   Глобальная
 Команда меню:          Options|Compiler|Debug Information

 Замечания:
Отладочная информация состоит из таблицы номеров строк для каждой процедуры. В таблице записаны соответствия адресов объектного кода номерам строк исходного текста.
Когда отладочная информация включена для данной программы или модуля, вы можете использовать автономный или интегрированный отладчики Borland для пошагового выполнения и установки контрольных точек в этом модуле.
Если в модуле или программе, компилируемых в состоянии {$D+}, происходит ошибка времени выполнения, Turbo Pascal автоматически переходит к оператору, который вызвал ошибку. Смотри Search|Find Error для информации относительно автоматического поиска ошибок.
Переключатель Options|Linker|Map File производит информацию для данного модуля только в том случае, если он компилировался в состоянии $D+.
Для модулей, отладочная информация записывается в TPW, TPP или TPU файл вместе с объектным кодом.
Отладочная информация увеличивает размер TPU, TPW и TPP файлов и занимает дополнительное место в памяти при компиляции программ, использующих модуль, но она не влияет на размер или быстродействие самой программы.
Переключатель Debug Information обычно используется вместе с переключателем Local Symbols.

ВНИМАНИЕ: Если вы хотите использовать для отладки вашей программы Turbo Debugger for Windows, включите опцию Options|Linker|Debug Info in EXE или установите следующие опции:
 Compile|Destination -> Disk
 Options|Debugger, Debuuging -> Standalone

$E: Эмуляция 80x87
 -------------------
Включает или выключает компоновку библиотеки программной эмуляции 80x87 в EXE файл.

 Синтаксис:             {$E+} или {$E-}
 Значение по умолчанию: {$E+}
 Тип:                   Глобальная
 Команда меню:          Options|Compiler|[X] Emulation

 Режим:                 Real, Protected

Директива $E включает или выключает компоновку библиотеки эмуляции математического сопроцессора 80x87, при его отсутствии.

Состояние {$N+, E+}: Когда вы компилируете программу в состоянии {$N+, E+}, компилятор компонует программу с полным эмулятором 80x87.
Возникающий в результате EXE файл может быть выполнен на любой машине, независимо от того, имеет ли она сопроцессор или нет. Если сопроцессор присутствует, то программа использует его, иначе, сопроцессор эмулируется соответствующей библиотекой поддержки.

Состояние {$N+, E-}: В состоянии {$N+, E-}, компилятор компонует программу с меньшей библиотекой поддержки чисел с плавающей точкой, которая может использоваться только в том случае, если во время выполнения программы присутствует сопроцессор.
Состояние переключателя {$E} не имеет никакого значения, если он используется в модуле. Этот переключатель применяется только при компиляции программ.
Состояние {$N-, E+} Если программа компилируется в состоянии {$N-}, и все модули, используемые программой компилировались в состоянии {$N-}, то библиотека поддержки 80x87 не требуется, и состояние переключателя {$E} игнорируется.

$F: Дальний тип вызова
 -----------------------
Задает модель вызова, используемую для последовательно компилируемых процедур и функций.

 Синтаксис:             {$F+} или {$F-}
 Значение по умолчанию: {$F-}
 Тип:                   Локальная
 Команда меню:          Options|Compiler|Force Far Calls

Состояние $F+:
Процедуры и функции, компилируемые в состоянии $F+ всегда используют модель дальнего (FAR) вызова.

Состояние $F-:
В состоянии $F-, компилятор автоматически выбирает соответствующую модель:
 - FAR, если процедура или функция объявлена в разделе интерфейса модуля
 - NEAR, если процедура или функция объявлена где-либо еще

ВНИМАНИЕ: Для программ, использующих оверлеи, поставьте директиву $F+ в начале программы и каждого модуля, чтобы удовлетворить требованию дальнего вызова.

Для программ, использующих процедурные переменные, все эти процедуры должны использовать далекую (FAR) модель кода.
Код
Procedure FarProc; Far; Begin
 ...
End;


$G: Генерация инструкций 80x286
 --------------------------------
Включает или выключает генерацию объектного кода для 286-х процессоров.

 Синтаксис:             {$G+} или {$G-}
 Значение по умолчанию: {$G-} для реального режима
                        {$G+} для защищенного режима и среды Windows
 Тип:                   Глобальная
 Команда меню:          Options|Compiler|286 Instructions

Состояние $G-:
В состоянии $G- генерируются только основные инструкции процессора 8086.
Программы, компилируемые в этом состоянии можно выполнять на любом процессоре семейства 80x86.

Состояние $G+:
В состоянии $G+, компилятор использует дополнительные команды процессора 80286 для улучшений генерации объектного кода.
Программы, компилируемые в этом состоянии нельзя выполнять на процессорах 8088 и 8086.

Дополнительные команды, используемые в режиме $G+ включают:
 - ENTER
 - LEAVE
 - PUSH непосредственное значение
 - Расширенная IMUL
 - Расширенная SHL
 - Расширенная SHR

ВНИМАНИЕ: (Для Windows), если программа или библиотека или любой модуль, используемый программой или библиотекой, компилируется в состоянии {$G+}, то в заголовке возникающего в результате EXE или DLL будет установлен флаг защищенного режима, и Windows не будет выполнять его в реальном режиме.

$I: Проверка ввода/вывода
 --------------------------
Включает или выключает автоматическую генерацию объектного кода, которая проверяет результат обращения к процедуре ввода/вывода.

 Синтаксис:             {$I+} или {$I-}
 Значение по умолчанию: {$I+}
 Тип:                   Локальная
 Команда меню:          Options|Compiler|I/O checking

 Замечания:
Если процедура ввода/вывода возвращает ненулевой результат ввода/вывода, когда переключатель $I включен, то программа завершается и выводится сообщение об ошибке времени выполнения.
Если переключатель $I выключен, то вы должны использовать функцию IOResult для проверки ошибок ввода/вывода.

$K: Подпрограммы повторного вызова
 -----------------------------------
Управляет порождением повторных вызовов для процедур и функций, экспортируемых приложением.

 Синтаксис:             {$K+} или {$K-}
 Значение по умолчанию: {$K+}
 Тип:                   Глобальная
 Команда меню:          Options|Compiler|Smart callbacks

 Режим:
Windows

 Замечания:
Когда приложение компилируется в состоянии $K-, необходимо использовать подпрограммы API Windows MakeProcInstance и FreeProcInstance при создании подпрограмм повторного вызова.

В состоянии $K+, нет необходимости использовать MakeProcInstance и FreeProcInstance.

$L: Информация о локальных символах
 -------------------------------------
Включает или выключает генерацию информации о локальных символах.

 Синтаксис:             {$L+} или {$L-}
 Значение по умолчанию: {$L+}
 Тип:                   Глобальная
 Команда меню:          Options|Compiler|Local symbols

 Замечания:
Информация о локальных символах состоит из:
 - Символов в части реализации модуля (имен и типов всех локальных переменных и констант модуля)
 - Символов внутри процедур и функций модуля

Когда опция "Local symbols" включена, вы можете использовать автономный или интегрированный отладчик для проверки и изменения значений локальных переменных модуля или программы.
Вызовы процедур и функции модуля могут быть исследованы через окно View|Stack или с помощью команды Debug|Call Stack.
Опция Options|Linker|Map File производит информацию о локальных символах данного модуля только в том случае, если этот модуль компилировался в состоянии $L+.
Для модулей, информация о локальных символах записывается в файл модуля вместе с объектным кодом модуля. Информация о локальных символах увеличивает размер файла модуля и занимает дополнительную область памяти при компиляции программ, использующих модуль. Она не влияет на размер или на быстродействие готовой программы.
Этот переключатель обычно используется совместно с переключателем отладочной информации $D.
ВНИМАНИЕ: директива $L игнорируется, если отладочная информация выключена {$D-}.

$N: Математический сопроцессор
 -------------------------------
Переключает между двумя различными моделями генерации объектного кода обработки чисел с плавающей точкой, обеспечиваемыми компилятором.

 Синтаксис:             {$N+} или {$N-}
 Значение по умолчанию: {$N-}
 Тип:                   Глобальная
 Команда меню:          Options|Compiler|8087/80287

Состояние $N-:
В состоянии $N-, компилятор генерирует код для выполнения всех вещественных вычислений программно, вызывая подпрограммы библиотеки поддержки.

Состояние $N+:
В состоянии $N+, компилятор генерирует код для выполнения всех вещественных вычислений с использованием математического сопроцессора 80x87 и дает вам доступ к четырем дополнительным вещественным типам: Single, Double, Extended и Comp.

ВНИМАНИЕ: Вы можете также использовать директиву $E+, чтобы эмулировать 80x87. Это дает вам доступ к вещественным типам при отсутствии 80x87 сопроцессора.

$O: Генерация оверлейного кода
 -------------------------------
Включает и выключает генерацию оверлейного объектного кода.

 Синтаксис:             {$O+} или {$O-}
 Значение по умолчанию: {$O-}
 Тип:                   Глобальная
 Команда меню:          Options|Compiler|[X] Overlays allowed

 Режим:
 Real

Состояние {$O+}
В состоянии {$O+}, генератор объектного кода принимает специальные меры предосторожности при передаче строковых и наборных констант из одной оверлейной процедуры или функции в другую.
Использование директивы {$O+} в модуле не вынуждает вас делать его оверлейным, но компилятор позволяет модулю быть оверлейным только в том случае, если он компилировался в режиме {$O+}.
Если вы создаете модули, которые планируете использовать и в оверлейных, и в не-оверлейных приложениях, то компилируйте их в режиме {$O+}, что гарантирует, что вы можете использовать один и тот же модуль в разных типах приложений.
ВНИМАНИЕ: директива компилятора {$O} почти всегда используется с директивой {$F+}, чтобы удовлетворить требованию дальнего (FAR) типа вызова менеджера оверлеев.

$P: Открытые строковые параметры
 ---------------------------------
Управляет значением переменных параметров, объявленных с использованием зарезервированного слова String.

 Синтаксис:             {$P+} или {$P-}
 Значение по умолчанию: {$P-}
 Тип:                   Глобальная
 Команда меню:          Options|Compiler|Open parameters

Состояние $P-:
В состоянии $P-, переменные параметры, объявленные с помощью ключевого слова String являются нормальными переменными параметрами. Это обеспечивает совместимость с более ранними версиями Turbo Pascal.

Состояние $P+:
В состоянии $P+, переменные параметры, объявленные с помощью ключевого слова String являются открытыми строковыми параметрами. Независимо от состояния директивы $P, для объявления открытых строковых параметров может использоваться идентификатор OpenString.
Фактическим параметром открытого строкового параметра может быть переменная любого строкового типа, и, внутри процедуры или функции, атрибут максимальной длины формального параметра будет таким же, как и у фактического параметра.

$Q: Проверка переполнения
 --------------------------
Управляет генерацией кода проверки переполнения.

 Синтаксис:             {$Q+} или {$Q-}
 Значение по умолчанию: {$Q-}
 Тип:                   Локальная
 Команда меню:          Options|Compiler|Overflow checking

Состояние $Q+:
В состоянии $Q+, некоторые целочисленные операции проверяются на переполнение, например:
  +, -, *, Abs, Sqr, Succ и Pred
Код для каждой из этих арифметических операций сопровождается дополнительным кодом, который проверяет, находится ли результат внутри обеспечиваемого диапазона.
Если проверка переполнения не выдерживается, то программа завершается и выводится сообщение об ошибке времени выполнения.
Обратите внимание, что {$Q} не влияет на стандартные процедуры Inc и Dec. Эти процедуры никогда не проверяются на переполнение. Переключатель $Q обычно используется вместе с переключателем $R.
Включение проверки переполнения замедляет вашу программу и делает ее больше, так что используйте {$Q+} только для отладки.
Состояние $Q-:
В состоянии $Q- проверка переполнения не производится.

$R: Проверка диапазона
 -----------------------
Включает и выключает генерацию кода проверки диапазона.

 Синтаксис:             {$R+} или {$R-}
 Значение по умолчанию: {$R-}
 Тип:                   Локальная
 Команда меню:          Options|Compiler|Range Checking

Состояние $R+:
В состоянии $R+:
 - Все индексы массивов и строк проверяются на принадлежность
   допустимым пределам
 - Все присваивания скалярным и поддиапазонным переменным проверяются
   на принадлежность заданным диапазонам

Если проверка принадлежности диапазону не выдерживается, то программа завершается и выводится сообщение об ошибке времени выполнения.
$R+ не влияет на процедуры Inc и Dec.
Включение проверки диапазона замедляет вашу программу и делает ее больше.
Используйте эту опцию при отладке, затем выключите ее, если уверены, что в вашей программе нет ошибок.

$S: Проверка переполнения стека
 --------------------------------
Включает и выключает генерацию кода проверки переполнения стека.

 Синтаксис: {$S +} или {$S-}
 Значение по умолчанию: {$S +}
 Тип: Локальный
 Команда меню: Options|Compiler|  Проверка стека

Состояние $S+:
В состоянии $S+, компилятор генерирует специальный код в начале каждой процедуры или функции для проверки, достаточно ли места в стеке для локальных переменных и другой временной памяти.
Когда в стеке недостаточно свободного места, вызов процедуры или функции, компилируемых в режиме $S+ заставляет программу завершиться и вывести сообщение об ошибке времени выполнения программы.

Состояние $S-:
Когда в стеке недостаточно свободного места, вызов процедуры или функции, вероятно, вызовет сбой системы.

$T: Проверка типов указателей
 ------------------------------
Управляет типами указателей, созданных оператором @.

 Синтаксис:             {$T+} или {$T-}
 Значение по умолчанию: {$T-}
 Тип:                   Локальная
 Команда меню:          Options|Compiler|Typed @ operator

Состояние $T-:
В состоянии $T-, тип результата оператора @ - всегда нетипизированный указатель.

Состояние $T+:
Когда оператор @ применяется к переменной в состоянии $T+, тип результата - ^T, где T совместим только с другими указателями на данный тип переменной.

$V: Проверка строковых параметров
 ----------------------------------
Управляет проверкой типов строк, переданных как переменные параметры.

   Синтаксис:             {$V+} или {$V-}
   Значение по умолчанию: {$V +}
   Тип:                   Локальная
   Команда меню:          Options|Compiler|Strict var-strings

Состояние $V+:
В состоянии $V+, выполняется строгий контроль соответствия типов, чтобы формальные и фактические параметры имели идентичные строковые типы.

Состояние $V-:
В состоянии $V-, любая переменная со строковым типом позволяется как фактический параметр, даже если объявленная максимальная длина не такая же как и у формального параметра. Хотя $V- все еще поддерживается, вы должны использовать открытые строковые параметры.

$W: Область стека Windows
 --------------------------
Генерирует специальные пролог- и эпилог- коды для дальних процедур и функций.

 Синтаксис:             {$W+} или {$W-}
 Значение по умолчанию: {$W +}
 Тип:                   Локальная
 Команда меню:          Options|Compiler|Windows stack frames

 Режим:
Windows

Состояние $W+:
В состоянии $W+, компилятор генерирует специальный код входа и выхода для дальних процедур и функций.
Этот код дает возможность менеджеру памяти реального режима Windows правильно идентифицировать дальние записи активации, когда он корректирует цепочку вызовов после перемещения сегмента кода или данных.

Состояние $W-:
В состоянии $W-, компилятор не генерирует такого кода.
Отключите эту опцию, если ваша программа выполняется только в стандартном режиме Windows или только в расширенном режиме Windows 386.

$X: Расширенный синтаксис
 --------------------------
Включает или выключает расширенный синтаксис Turbo Pascal.

 Синтаксис:             {$X+} или {$X-}
 Значение по умолчанию: {$X+}
 Тип:                   Глобальная
 Команда меню:          Options|Compiler|Extended syntax

Состояние $X+:
В состоянии $X+, функции могут использоваться как простые операторы - результат функции может быть отброшен.
Вообще, вычисления, выполняемые функцией представляются ее результатом, так что немного смысла его отбрасывать. Однако, в некоторых случаях, функция может выполнять несколько операций, основываясь на параметрах. В некоторых из этих случаев она может не производить результат.
В таких случаях, $X+ позволяет обрабатывать функцию как процедуру.
Директива $X+ не относится ко встроенным функциям (функциям, определенным в модуле System).
Режим $X+ также включает поддержку строк с заверщающим нулем, активизируя специальные правила, относящиеся ко встроенному типу PChar и нуль-основанным символьным массивам. Смотри модуль Strings для подробной информации.

Состояние $X-:
В заданном по умолчанию состоянии $X-, расширенный синтаксис выключен. Попытка использовать его вызовет ошибку.

$Y: Информация о символах
 --------------------------
Включает или выключает генерацию информации о ссылках на символы.

 Синтаксис:             {$Y+} или {$Y-}
 Значение по умолчанию: {$Y+}
 Тип:                   Глобальная
 Команда меню:          Options|Compiler|Symbol information

Информация о ссылках на символы состоит из таблиц, в которых находятся номера строк всех объявлений и ссылок на символы модуля.

Состояние $Y+:
Состояние $Y+ включает генерацию информации о ссылках на символы.
Информация о ссылках на символы для модулей записывается в TPU, TPP или TPW файле вместе с объектным кодом модуля. Информация о ссылках на символы увеличивает размер TPU, TPP или TPW файлов, но не влияет на размер или быстродействие готовой программы, использующей данный модуль.
Переключатель $Y не дает эффекта, если выключены переключатели $D и $L.

Состояние $Y-:
В состоянии $Y-, генерация информации о ссылках на символы выключена.


--------------------
Мы - Днепряне. Мы всех сильней.
PM ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0700 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.