$IfOpt — Директива компилятора Delphi

$IfOpt — Директива компилятора Delphi

В Delphi 2009 (или более старые версии), как вы проверяете параметр компиляции «Align» в коде?

Директива IFOPT работает только с чистыми коммутаторами ( <$IFOPT A4>не компилируется).

Я не мог найти эквивалентную константу или такую ​​определенную ( <$IF Align = 4>или такую)

Вы можете сделать это, указав запись с известными правилами упаковки и проверив ее с помощью SizeOf. Протестировано в Delphi 2009:

Введите код, чтобы проверить фактическое поведение во время выполнения. Единственный способ, о котором я могу думать.

Основные директивы компилятора

<$A+>, ‑ выравнивание полей записей на границу слова.

<$B+>, ‑ вычисление логических выражений полностью.

<$С+>, ‑ проверка условий в процедуре Assert (п. 1.7.9).

<$D+>, ‑ генерация отладочной информации.

<$D ‘текст’>, ‑ заголовок программы DLL.

<$G+>, ‑ включение в пакет данных.

<$I+>, ‑ включение контроля результатов работы операции файлового ввода‑вывода. При возникновении ошибки генерируется исключение EinOutError (п.1.6.2). Если , исключение не генерируется, а для анализа результата используется функция IOResult (п.1.8.2.1).

<$L файл>, ‑ использовать компоновщику указанный файл для связывания с программой или модулем.

<$H+>, ‑ использовать строку типа String как длинную.

<$P+>, ‑ использовать открытые строки.

<$Q+>, ‑ проверка переполнения при целочисленных операциях (исключение EIntOverFlow (п.1.7.9)).

<$R+>, ‑ проверка диапазона целочисленных значений, индексов массивов и коротких строк (исключение ERangeError (п.1.7.9)).

<$R файл>, ‑ указывает имя ресурсного файла.

‑ компиляция пакета только на этапе выполнения программы.

<$T+>, ‑ контроль за соответствием типов указателей.

<$M+>, ‑ генерация кода контроля типов при выполнении.

минимальное (n) и максимальное (k) значения размера стека в байтах для размещения локальных переменных. Если размер мал, то генерируется исключение EstackOverFlow (п.1.6.2) ($M 16384, 1048576).

<$V+>, ‑ контроль длины строковых параметров.

<$J+>, ‑ типизированные константы рассматриваются как переменные с исходными значениями.

Директивы условной компиляции

‑ определение условного идентификатора.

‑ отмена ранее определенного, условного идентификатора.

(<$IfNDef идентификатор>) ‑ возвращает истину (ложь), если определен указанный условный идентификатор.

‑ возвращает истину, если включена указанная ключевая директива компилятора (например, ).

‑ начало области действия ложности директивы Ifxxxx (IfDef,IfOpt, OfNDef).

‑ конец всей области действия условной директивы Ifxxxx.

Условная компиляция производится по схеме:

Обычно эти директивы используются для включения отладочных операторов или при разработке программ, которые настраиваются при ком­пиляции на внешние параметры, определенные в качестве условных идентификаторов. Оставляя в программе определения нуж­ных условных идентификаторов, пользователь настраивает исходный текст программы на требуемый вариант ее работы без включения в код прог­раммы ненужных фрагментов, что повышает эффективность ее работы.

Пример задания параметра районного коэффициента к зарплате:

<$Define RegionalKoef>//параметр учета районного коэффициента

Этапы разработки проекта

Разработка интерфейса и программного кода

Разработка проекта состоит из двух шагов: создание интерфейса (внеш­ний вид форм, сценарии взаимодействия пользователя с приложе­ни­ем) и программного кода обработки данных (процедуры обработки собы­тий, ввода, обработки и вывода данных на различные носители).

Интер­фейс состоит из компонентов (п. 2.1.5), которые выбираются из палитры ком­понентов (п. 2.1.2) и визуально размещаются на формах проекта (п. 2.1.6).

Компиляция

Компиляция проекта выполняется по команде Project/Compile или кла­вишами ^F9. При компиляции проекта производятся следующие дей­ствия: компилируются все устаревшие модули и модули, которые под­клю­чают командой Uses устаревшие модули. Устаревшими модулями мо­гут быть исходные (Pas), объектные (Obj) и подключаемые (.Inc) модули. Пос­ле компиляции формируется исполняемый файл приложения с именем проек­та.

Cборка

Кроме компиляции можно выполнить сборку проекта командой Project/Build , при которой компилируются все файлы, а не только устаревшие.

Выполнение

Выполнить проект можно из среды Delphi командой Run/Run или клавишей F9; при этом устаревшие файлы будут откомпилированы заново. При таком запуске имеются ограничения: нельзя запустить копию приложения, продолжить разработку приложения можно только после завершения его выполнения. При зацикливании приложения завершение его работы производится командой Run/Program Reset или клавишами ^F2. Для отладки можно использовать средства отладки (п. 1.3.7). Если программа использует параметры, то их нужно задать в поле Run parameters одноименного окна, вызываемого командой Run/Parameters.

Из среды Windows приложение запускается, как и любое другое приложение. Программу можно запустить и из приложения (п. 1.7.8).

1.3.6.5. Выполнение консольного приложения и DOS‑программ

Консольное приложение имитирует работу в текстовом режиме. Ввод и вывод осуществляются процедурами Read, Readln, Write и Writeln. Достоинством консольного приложения является возможность переноса в Delphi программ, написанных на Паскале в среде Dos, и небольшой объем ис­полняемых EXE‑файлов. Такое приложение создается командой File/ New/Con­sole Wizard либо на основе уже существующего проекта: удалить форму командой Project/Remove From Project, вызвать окно редактора кода командой Project/View Source и произвести необходимые изменения.

Пример:

Program Project1; <$apptype console>//директива компилятора

Uses sysutils, Windows; //подключаемые модули

Begin SetConsoleTitle(‘Консольное окно’); //заголовок окна приложения

Writeln(‘Proverka’); Readln; End. //текст программы

Внимание! В консольных приложениях используется кодировка сим­­­волов, принятая в DOS. Это не позволяет выводить без допол­нитель­ной перекодировки текст, набранный в Delphi.

Отладка

Отладка ‑ это процесс поиска и устранения ошибок в программе. Ошибки бывают двух типов: синтаксические (неверное написание предложений Паскаля), которые обнаруживаются самим компилятором, и логические (ошибки в самом кодируемом алгоритме).

Сообщения о синтаксических ошибках выводятся в нижней части ок­на редактора. При двойном щелчке на сообщении об ошибке подсве­чи­вает­­ся и становится текущей строка программы c ошибкой.

Для отладки имеется специальный встроенный отладчик, средства которого находятся в меню Run и подменю View/Debug Windows. Настройка отладчика производится командой Tools/Debugger Options.

Условная компиляция в Delphi 7

Иногда программисту нужно управлять дерективами процессора и компиляцией программного кода. Для этого в Delphi реализована условная компиляция. Существуют два пути построения условной компиляции.

В ней реализован метод проверки некоторого условия. Как мы видим, она начинается с условной директивы и заканчивается . Если условие в конструкции после $IF не выполняется, то конструкция не компилируется. Можно сделать вывод о второй конструкции на основании $IF. Значит можно поставить .

Условная компиляция во втором случае ведет себя также как и полный условный оператор в теле программы. Соответственно если истина, то после не компилируется. Иначе все наоборот.

Условные директивы. Задаем само условие идентификатора: . Сама условная директива будет иметь вид: . Она проверяет, был определен указанный в ней условный идентификатор в конструкции вида .

Таким образом, если задан условный иденификатор в , то директива будет проверять на истину и фрагмент будет компилироваться. Указанием директивы вместо можно добиться от ложь и фрагмент кода не будет откомпилирован.

Условные идентификаторы должны начинаться с буквы и может быть любой длины. Предопределены некоторые идентификаторы: VER150, MSWINDOWS, WIN32, LINUX, CPU386, CONSOLE, CONDITIONAL EXPRESSIONS. По названимям можно понять, что они способствуют настройке приложения на различные платформы.

возвращает истину, если включена указанная опция. Опции вы можете посмотреть на этой странице. Конструкция вида

дает возможность вводить в процессе отладки различные отладочные печати.

Delphi #IF(DEBUG) equivalent?

Is there a Delphi equivalent of the C# #if(DEBUG) compiler directive?

4 Answers 4

Apart from what lassevk said, you can also use a few other methods of compiler-evaluation (since Delphi 6, I believe) :

To check if the compiler has this feature, use :

There are several uses for this.

For example, you could check the version of the RTL; From the Delphi help :

You can use RTLVersion in $IF expressions to test the runtime library version level independently of the compiler version level.
Example: <$IF RTLVersion >= 16.2> .

Also, the compiler version itself can be checked, again from the code:

CompilerVersion is assigned a value by the compiler when the system unit is compiled. It indicates the revision level of the compiler features / language syntax, which may advance independently of the RTLVersion. CompilerVersion can be tested in $IF expressions and should be used instead of testing for the VERxxx conditional define. Always test for greater than or less than a known revision level. It’s a bad idea to test for a specific revision level.

Another thing I do regularly, is define a symbol when it’s not defined yet (nice for forward-compatiblity), like this :

ДИРЕКТИВЫ КОМПИЛЯТОРА

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

В состоянии <$А+>все переменные и типизированные кон­станты, превышающие по размеру один байт, выравниваются по границе машинного слова (адреса с четными значениями).

В состоянии <$А->никаких действий по выравниванию не предпринимается.

Осуществляет два различных вида генерации кода для бу­левых операций and и or.

В состоянии <$В+>компилятор генерирует код для пол­ного вычисления булева выражения.

В состоянии <$В->компилятор генерирует код для вычис­ления булева выражения по короткой схеме.

Используется для управления атрибутами сегмента кода (только для Windows и защищенного режима).

Каждый сегмент кода в прикладной программе или биб­лиотеке имеет набор атрибутов, которые определяют пове­дение кодового сегмента при его загрузке в память.

Директива влияет только на тот сегмент кода программ­ного модуля (модуля, программы или библиотеки), в кото­ром она размещена.

Задает или отменяет генерацию информации для отладки. Если программа или модуль компилируются в состоянии <$D+>, встроенный отладчик Turbo

Pascal позволяет вы­полнять этот модуль по шагам и устанавливать в нем точки останова. По умолчанию — <$D+>.

Определяет условный идентификатор с данным именем. Идентификатор будет определенным для оставшейся части исходного компилируемого кода или до тех пор, пока он не появится в директиве <$UNOEFINE имя>. Если имя уже опреде­лено, директива <$DEFINE имя>не вызывает никаких действий.

Вставляет заданный текст в запись описания модуля в заго­ловке файла *.ехе или *.dll (только для Windows и защищен­ного режима).

Приводит к компиляции или игнорированию исходного тек­ста, ограниченного последней директивой <$IFxxx>и сле­дующей директивой <$ENDIF>.

Разрешает или запрещает компоновку с библиотекой испол­няющей системы, которая будет эмулировать работу сопро­цессора 8087 в случае его отсутствия.

В состоянии <$N+,E->Turbo Pascal может создавать про­грамму, которая используется только при наличии сопро­цессора 8087. По умолчанию — <$Е->.

Заканчивает условную компиляцию, начатую последней ди­рективой <$IFxxx>.

Управляет выбором типа вызова последовательно компили­руемых процедур и функций. Процедуры и функции, ском­пилированные в состоянии <$F+>, всегда используют даль­ний тип обращений. При указании директивы <$F->Turbo Pascal автоматически выбирает соответствующий тип об­ращений: дальний (far), если процедура или функция описывается в разделе

интерфейсов программной единицы, и ближний (near) — в противном случае. По умолчанию — <$F->.

Разрешает или запрещает генерацию кода для процессора 80286. В состоянии <$G->генерируются только инструкции процессора 8086, и программы, сгенерированные в этом состо­янии, могут выполняться на любом процессоре серии 80×86. По умолчанию:

a) + реальный режим — <$G->;

б) + защищенный режим и Windows — .

Позволяет задавать группы модулей, которые компоновщик должен размещать в одном сегменте (только для Windows и защищенного режима).

Каждая директива задает группу модулей. Директива допускается только в секции uses программы или биб­лиотеки. Атрибутами сегмента кода можно управлять с помощью директивы $G. Допустимый размер сегмента устанавливает­ся директивой $S.

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

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

Компилирует следующий исходный текст, если переключа­тель находится в указанном состоянии. Переключатель (ди­ректива) состоит из имени директивы, за которым следует знак «плюс» (+) или «минус» (-).

Сообщает компилятору о необходимости включить в ком­пиляцию названный файл. Фактически файл вставляется в скомпилированный текст непосредственно за директивой <$1 имя_файла>.

Задает или отменяет генерацию кода, проверяющего резуль­тат обращения к процедуре ввода-вывода. По умолчанию — <$I+>.

Управляет генерацией эффективных вызовов экспортируе­мых приложением процедур и функций (только для Win­dows). Когда прикладная программа генерируется в состоянии <$К->, то при создании вызываемых подпрограмм API Win­dows она должна использовать подпрограммы MakeProcInstance и FreeProcInstance. В состоянии по умолчанию (<$К+>) приклад­ная программа сама может вызывать экспортированные точ­ки входа, и использовать подпрограммы MakeProcInstance и FreeProcInstance нет необходимости. По умолчанию — <$К+>.

Предписывает компилятору скомпоновать указанный файл с компилируемой программой или программным модулем. Используется для компоновки кода, написанного на языке ассемблера для внешних (external) подпрограмм.

Приводит в действие или отменяет генерацию информации о локальных идентификаторах. По умолчанию — <$L+>.

Директива в разных режимах выглядит по-разному:

Указывает параметры распределения памяти программы. При использовании в модулях игнорируется. По умолчанию:

б)+ защищенный режим — <$М 16384>;

Осуществляет выбор одной из двух моделей генерации кода вычисления с плавающей точкой, имеющихся в Turbo Pascal.

При указании директивы <$N->генерируется код для вы­полнения в программном обеспечении всех вычислений типа real путем вызова программ библиотеки исполняющей сис­темы Turbo Pascal.

При указании директивы <$N+>генерируется код для вы­полнения всех вычислений типа real с помощью сопроцессо­ра математических вычислений 8087. По умолчанию — <$N->.

Разрешает или запрещает генерацию оверлейного кода (только для реального режима). Turbo Pascal разреша­ет использовать модуль в качестве оверлейного только в том случае, если он был скомпилирован с директивой <$O+>.

Директива компилятора <$О+>почти всегда указывается совместно с директивой компилятора <$F+>, что позволяет выполнить требования администратора оверлеев по исполь­зованию дальнего типа вызовов (far).

При использовании в модуле не действует, а при компиляции программы задает, какие используемые в программе моду­ли нужно поместить вместо файла *.ехе в файл *.ovr (только для реального режима). Директивы должны указываться в секции uses программы.

Управляет трактовкой параметров-переменных, описанных с помощью ключевого слова string. В состоянии <$Р->пара­метры-переменные, описанные с ключевым словом string, являются нормальными параметрами, а в состоянии <$Р+>они являются открытыми строковыми параметрами.

Управляет генерацией кода проверки переполнения. В со­стоянии <$Q+>отдельные арифметические операции (+, -, *, Abs, Sqr, Succ и Pred) проверяются на переполнение.

Директива <$0+>не влияет на стандартные директивы Inc и Dec. Эти процедуры никогда не проверяются на переполне­ние.

Обычно используется в сочетании с переключателем $R, — который разрешает или запрещает генерацию кода провер­ки диапазона. По умолчанию — <$Q->.

Приводит в действие и отменяет генерацию кода с провер­кой границ. При указании <$R+>все выражения с индекси­рованными строками и массивы проверяются на предмет нахождения их внутри указанных границ, а все операторы присваивания скалярным величинам и переменным поддиа­пазонов проверяются на нахождение в заданных границах.

Если директива $R включена, то все обращения к вирту­альным методам проверяются на состояние инициализации для экземпляра объекта, выполняющего вызов.

Разрешение проверки границ и вызовов виртуальных ме­тодов замедляет выполнение программ и несколько увели­чивает их размер, поэтому директиву <$R+>следует исполь­зовать только для отладки. По умолчанию — <$R->.

Задает имя файла ресурсов, который должен включаться в прикладную программу или библиотеку (только для Win­dows и защищенного режима). Указанный файл должен представлять собой файл ресурсов Windows. По умолчанию он имеет расширение *.res.

Допустима только в основной программе или библиотеке (только для Windows и защищенного режима). Директива задает предпочитаемый размер сегмента кода для группиро­вания модулей. Указанный размер должен лежать в диапа­зоне 0-65 535. Модули, превышающие заданный размер, раз­мещаются в своих собственных сегментах кода.

Директива никогда не выдает предупреждений или со­общений об ошибках. Если модули нельзя разместить в сег­менте кода с другими модулями, он автоматически помеща­ется в отдельный сегмент. По умолчанию — <$5 16384>.

Приводит в действие или отменяет генерирование кода с про­веркой переполнения стека.

При указании <$S+>компилятор генерирует в начале каж­дой процедуры или функции код, который проверяет, дос­таточное ли место в стеке выделено для локальных перемен­ных. По умолчанию — <$S+>.

Управляет типами значений указателей, генерируемых опе­рацией @.

В состоянии <$Т->тип результата операции @ всегда яв­ляется нетипизированным указателем, совместимым со все­ми другими типами указателей. Когда к ссылке на перемен­ную в состоянии <$Т+>применяется операция @, результат имеет тип Л Т, где тип Т совместим только с указателями на тип переменной. По умолчанию — <$Т->.

Отменяет ранее определенный условный идентификатор.

Управляет проверкой типа при передаче строк в качестве параметров-переменных. В состоянии <$V+>выполняется строгая проверка типа, при которой требуется, чтобы фор­мальный и фактический параметры имели идентичные строковые типы (string). В состоянии <$V->в качестве фак­тического параметра допускается использовать любую пе­ременную строкового типа, даже если ее описанная длина не совпадает с длиной соответствующего формального па­раметра. По умолчанию — <$V+>.

Управляет генерацией специфического для Windows кода входа и выхода для процедур и функций с дальним типом вызова (far) (только для Windows). В состоянии <$W+>для процедур и функций far генерируется специальная запись входа и выхода, благодаря чему подсистема управления памятью реального

режима Windows может корректно идентифицировать дальние кадры стека при настройке на цепочки вызова после перемещения сегмента кода или данных.

В состоянии <$W->генерируется дополнительная запись входа или выхода.

Разрешает или запрещает расширенный синтаксис Turbo Pascal.

Директива <$Х+>не применяется к встроенным функци­ям (то есть функциям, определенным в модуле System).

Директива компилятора <$Х+>разрешает поддержку в Turbo Pascal строк с завершающим нулем, активизируя специальные правила, которые применяются к встроенно­му типу PChar и строкам с нулевой базой. По умолчанию — <$Х+>.

Разрешает или запрещает генерацию для идентификаторов ссылочной информации.

Когда программа или модуль компилируются в состоя­нии <$Y+>, встроенное средство просмотра Turbo Pascal может выводить для этого модуля определения идентифи­катора и ссылочную информацию.

Обычно используется в сочетании с переключателями $D и $L, которые управляют генерацией отладочной информа­ции и информацией о локальных идентификаторах. Дирек­тива $Y не оказывает влияния, если не разрешены директи­вы $D и $L. По умолчанию — <$Y+>.

Список литературы

1. Абрамов С. А., Гнездшова Г. Г., Капустина Е. Н., Селюн М. И. Задачи по программированию. М.: Наука, 1988.

2. Абрамов С. А., Зима Е.В. Начала программирования на языке Паскаль. М.: Наука, 1987.

3. Гусева А. И. Учимся информатике: задачи и методы их решения. 2-е изд., испр. и доп. М.: Диалог-МИФИ, 2001.

4. ЗеленякО.П. Практикум программирования на Turbo Pascal: Задачи, алгоритмы и решения. К.: ДиаСофт, 2001.

5. Кулътин Я. Б. Turbo Pascal в задачах и примерах. СПб. БХВ-Петербург, 2000.

6. Кулътин Я.Б. Программирование в Turbo Pascal 7.0 и Delphi. 2-е изд.,

перераб. и доп. СПб. БХВ-Петербург, 2001.

7. Немнюгин С. A. Turbo Pascal: Практикум. СПб.: Питер, 2001.

8. Попов Б. В. Turbo Pascal для школьников. Версия 7.0. М.: Финансы и статистика, 2001.

9. Прищепов МЛ., Степанцов В. П., Севернева Е. В. Экзамен по информатике. Основы алгоритмизации и програм­мирования: Справочное пособие. Минск: ТетраСис-темс,2001.

10. Немнюгин С. A. Turbo Pascal. СПб.: Питер, 2001.

11. Симонович С.В. и др. Информатика. Базовый курс. СПб. «Питер». 1999.

$IfOpt — Директива компилятора Delphi

<$I+>и <$I->— директивы контроля ввода/вывода <$M>и <$S>— директивы, определяющие размер стека <$M+>и <$M->— директивы информации времени выполнения о типах <$Q+>и <$Q->— директивы проверки переполнения целочисленных операций <$R>— директива связывания ресурсов <$R+>и <$R->— директивы проверки диапазона <$APPTYPE CONSOLE>— директива создания консольного приложения 1) Директивы компилятора, разрешающие или запрещающие проверку утверждений. По умолчанию <$C+>или <$ASSERTIONS ON>Область действия локальная Директивы компилятора $C разрешают или запрещают проверку утверждений. Они влияют на работу процедуры Assert,используемой при отладке программ. По умолчанию действует директива <$C+>и процедура Assert генерирует исключение EAssertionFailed, если проверяемое утверждение ложно. Так как эти проверки используются только в процессе отладки программы, то перед ее окончательной компиляцией следует указать директиву <$C->.

Условная компиляция на основе директивы компилятора в Delphi 2009

Есть ли способ в Delphi 2009, чтобы иметь раздел кода условно составлен на основе директивы компилятора. В частности, я хотел бы иметь код в место, которое только включены, если директивы компилятора диапазон проверка включена.

Что-то вроде этого:

<$ IFDEF RANGECHECKINGISON>[Сделать код проверки диапазона здесь]

1 ответ

Возможно, для Вашего проекта будут необходимы бесплатные векторные карты. На нашем сайте представлены карты для всех стран.

Директивы компилятора

директивы условной компиляции

<$C+>и <$C->— директивы проверки утверждений
<$I+>и <$I->— директивы контроля ввода/вывода
<$M>и <$S>— директивы, определяющие размер стека
<$M+>и <$M->— директивы информации времени выполнения о типах
<$Q+>и <$Q->— директивы проверки переполнения целочисленных операций
<$R>— директива связывания ресурсов
<$R+>и <$R->— директивы проверки диапазона
<$APPTYPE CONSOLE>— директива создания консольного приложения

1) Директивы компилятора, разрешающие или запрещающие проверку утверждений

По умолчанию <$C+>или

Область действия локальная

Директивы компилятора $C разрешают или запрещают проверку утверждений. Они влияют на работу процедуры Assert,используемой при отладке программ. По умолчанию действует

директива <$C+>и процедура Assert генерирует исключение EAssertionFailed, если проверяемое утверждение ложно.

Так как эти проверки используются только в процессе отладки программы, то перед ее окончательной компиляцией следует указать директиву <$C->. При этом работа процедур Assert будет блокировано и генерация исключений EassertionFailed производиться не будет.

Директивы действуют на весь файл исходного кода независимо от того, в каком месте файла они расположены.

2) Директивы компилятора, включающие и выключающие контроль файлового ввода-вывода

По умолчанию <$I+>или

Область действия локальная

Директивы компилятора $I включают или выключают автоматический контроль результата вызова процедур ввода-вывода Object Pascal. Если действует директива <$I+>, то при возвращении процедурой ввода-вывода ненулевого значения генерируется исключение EInOutError и в его свойство errorcode заносится код ошибки. Таким образом, при действующей директиве <$I+>операции ввода-вывода располагаются в блоке try. except, имеющем обработчик исключения EInOutError. Если такого блока нет, то обработка производится методом TApplication.HandleException.

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

В этом примере на время открытия файла отключается проверка ошибок ввода вывода, затем она опять включается, переменной i присваивается значение, возвращаемое функцией IOResult и, если это значение не равно нулю (есть ошибка), то предпринимаются какие-то действия в зависимости от кода ошибки. Подобный стиль программирования был типичен до введения в Object Pascal механизма обработки исключений. Однако сейчас, по-видимому, подобный стиль устарел и применение директив $I потеряло былое значение.

3) Директивы компилятора, определяющие размер стека

Область действия глобальная

Локальные переменные в процедурах и функциях размещаются в стеке приложения. При каждом вызове процедуры или функции ее локальные переменные помещаются в стек. При выходе из процедуры или функции эти локальные процедуры удаляются из стека. Директивы компилятора $M задают параметры стека приложения: его минимальный и максимальный размеры. Приложение всегда гарантированно имеет размер стека, равный его минимальной величине. Если при запуске приложения Windows обнаруживает, что не может выделить этот минимальный объем памяти, то выдается сообщение об этой ошибке.

Если во время работы выясняется, что минимального размера стека не хватает, то размер увеличивается на 4 K, но не более, чем до установленного директивой максимального размера. Если увеличение размера стека невозможно из-за нехватки памяти или из-за достижения его максимальной величины, генерируется исключение EStackOverflow. Минимальный размер стека по умолчанию равен 16384 (16K). Этот размер может изменяться параметром minstacksize директивы <$M>или параметром number директивы <$MINSTACKSIZE>.

Максимальный размер стека по умолчанию равен 1,048,576 (1M). Этот размер может изменяться параметром maxstacksize директивы <$M>или параметром number директивы <$MAXSTACKSIZE number>. Значение минимального размера стека может задаваться целым числом в диапазоне между1024 и 2147483647. Значение максимального размера стека должно быть не менее минимального размера и не более 2147483647. Директивы задания размера стека могут включаться только в программу и не должны использоваться в библиотеках и модулях.

В Delphi 1 имеется процедура компилятора <$S>, осуществляющая переключение контроля переполнения стека. Теперь этот процесс полностью автоматизирован и директива <$S>оставлена только для обратной совместимости.

4) Директивы компилятора, включающие и выключающие генерацию информации времени выполнения о типах (runtime type information — RTTI)

По умолчанию <$M->или

Область действия локальная

Директивы компилятора $I включают или выключают генерацию информации времени выполнения о типах (runtime type information — RTTI). Если класс объявляется в состоянии <$M+>или является производным от класса объявленного в этом состоянии, то компилятор генерирует RTTI о его полях, методах и свойствах, объявленных в разделе published. В противном случае раздел published в классе не допускается. Класс TPersistent, являющийся предшественником большинства классов Delphi и все классов компонентов, объявлен в модуле Classes в состоянии <$M+>. Так что для всех классов, производных от него, заботиться о директиве <$M+>не приходится.

5) Директивы компилятора, включающие и выключающие проверку переполнения при целочисленных операциях

По умолчанию <$Q->или

Область действия локальная

Директивы компилятора $Q включают или выключают проверку переполнения при целочисленных операциях. Под переполнением понимается получение результата, который не может сохраняться в регистре компьютера. При включенной директиве <$Q+>проверяется переполнение при целочисленных операциях +, -, *, Abs, Sqr, Succ, Pred, Inc и Dec. После каждой из этих операций размещается код, осуществляющий соответствующую проверку. Если обнаружено переполнение, то генерируется исключение EIntOverflow. Если это исключение не может быть обработано, выполнение программы завершается.

Директивы $Q проверяют только результат арифметических операций. Обычно они используются совместно с директивами <$R>, проверяющими диапазон значений при присваивании. Директива <$Q+>замедляет выполнение программы и увеличивает ее размер. Поэтому обычно она используется только во время отладки программы. Однако, надо отдавать себе отчет, что отключение этой директивы приведет к появлению ошибочных результатов расчета в случаях, если переполнение действительно произойдет во время выполнении программы. Причем сообщений о подобных ошибках не будет.

6) Директива компилятора, связывающая с выполняемым модулем файлы ресурсов

Область действия локальная

Директива компилятора <$R>указывает файлы ресурсов (.DFM, .RES), которые должны быть включены в выполняемый модуль или в библиотеку. Указанный файл должен быть файлом ресурсов Windows. По умолчанию расширение файлов ресурсов — .RES. В процессе компоновки компилированной программы или библиотеки файлы, указанные в директивах <$R>, копируются в выполняемый модуль. Компоновщик Delphi ищет эти файлы сначала в том каталоге, в котором расположен модуль, содержащий директиву <$R>, а затем в каталогах, указанных при выполнении команды главного меню Project | Options на странице Directories/Conditionals диалогового окна в опции Search path или в опции /R командной строки DCC32.

При генерации кода модуля, содержащего форму, Delphi автоматически включает в файл .pas директиву <$R *.DFM>, обеспечивающую компоновку файлов ресурсов форм. Эту директиву нельзя удалять из текста модуля, так как в противном случае загрузочный модуль не будет создан и сгенерируется исключение EResNotFound.

7) Директивы компилятора, включающие и выключающие проверку диапазона целочисленных значений и индексов

По умолчанию <$R->или

Область действия локальная

Директивы компилятора $R включают или выключают проверку диапазона целочисленных значений и индексов. Если включена директива <$R+>, то все индексы массивов и строк и все присваивания скалярным переменным и переменным с ограниченным диапазоном значений проверяются на соответствие значения допустимому диапазону. Если требования диапазона нарушены или присваиваемое значение слишком велико, генерируется исключение ERangeError. Если оно не может быть перехвачено, выполнение программы завершается.

Проверка диапазона длинных строк типа Long strings не производится. Директива <$R+>замедляет работу приложения и увеличивает его размер. Поэтому она обычно используется только во время отладки.

8) Директива компилятора, связывающая с выполняемым модулем файлы ресурсов

Область действия локальная

Директива компилятора <$R>указывает файлы ресурсов (.DFM, .RES), которые должны быть включены в выполняемый модуль или в библиотеку. Указанный файл должен быть файлом ресурсов Windows. По умолчанию расширение файлов ресурсов — .RES. В процессе компоновки компилированной программы или библиотеки файлы, указанные в директивах <$R>, копируются в выполняемый модуль. Компоновщик Delphi ищет эти файлы сначала в том каталоге, в котором расположен модуль, содержащий директиву <$R>, а затем в каталогах, указанных при выполнении команды главного меню Project | Options на странице Directories/Conditionals диалогового окна в опции Search path или в опции /R командной строки DCC32.

При генерации кода модуля, содержащего форму, Delphi автоматически включает в файл .pas директиву <$R *.DFM>, обеспечивающую компоновку файлов ресурсов форм. Эту директиву нельзя удалять из текста модуля, так как в противном случае загрузочный модуль не будет создан и сгенерируется исключение EResNotFound.

Директивы по версиям компилятора Delphi: <$ IFDEF VER180>— 2020

Подготовка к кодированию без барьеров. Узнайте, как преодолеть проблему с версией компилятора: компиляция кода Delphi для различных версий Delphi.

Если вы планируете писать код Delphi, который должен работать с несколькими версиями компилятора Delphi, вам необходимо знать, в каких версиях компилируется ваш код.

Предположим, вы пишете свой собственный (коммерческий) пользовательский компонент. Пользователи вашего компонента могут иметь разные версии Delphi, чем у вас.

Если они попытаются перекомпилировать код компонента (ваш код) — у них могут быть проблемы! Что если вы использовали параметры по умолчанию в ваших функциях, а у пользователя Delphi 3?

Директива компилятора: $ IfDef

Директивы компилятора — это специальные синтаксические комментарии, которые мы можем использовать для управления функциями компилятора Delphi. Компилятор Delphi имеет три типа директив: переключение директив, директивы параметров а также условные директивы, Условная компиляция позволяет нам выборочно компилировать части исходного кода в зависимости от того, какие условия установлены.

Директива компилятора $ IfDef запускает секцию условной компиляции.

Синтаксис выглядит так:

DefName представляет так называемый условный символ. Delphi определяет несколько стандартных условных символов. В приведенном выше «коде», если определено DefName, код выше $ Else компилируется.

Delphi Version Symbols

Распространенным применением директивы $ IfDef является тестирование версии компилятора Delphi.

В следующем списке указаны символы, которые необходимо проверить при условной компиляции для конкретной версии компилятора Delphi:

  • УСЛОВНОЕ ОБОЗНАЧЕНИЕ — Компиляционная версия
  • VER80 — Delphi 1
  • VER90 — Delphi 2
  • VER100 — Delphi 3
  • VER120 — Delphi 4
  • VER130 — Delphi 5
  • VER140 — Delphi 6
  • VER150 — Delphi 7
  • VER160 — Delphi 8
  • VER170 — Delphi 2005
  • VER180 — Delphi 2006
  • VER180 — Delphi 2007
  • VER185 — Delphi 2007
  • VER200 — Delphi 2009
  • VER210 — Delphi 2010
  • VER220 — Delphi XE
  • VER230 — Delphi XE2
  • WIN32 — Указывает, что операционной средой является Win32 API.
  • LINUX — Указывает, что операционной средой является Linux
  • MSWindows — Указывает, что операционной средой является MS Windows / li]
  • ПРИСТАВКА — Указывает, что приложение компилируется как консольное приложение.

Зная вышеупомянутые символы, можно написать код, который работает с несколькими версиями Delphi, используя директивы компилятора для компиляции соответствующего исходного кода для каждой версии.

Примечание: символ VER185, например, используется для обозначения компилятора Delphi 2007 или более ранней версии.

Использование символов «VER»

Обычно (и желательно) для каждой новой версии Delphi добавлять несколько новых подпрограмм RTL к языку.

Например, функция IncludeTrailingBackslash, представленная в Delphi 5, добавляет «» в конец строки, если ее там еще нет. В проекте Delphi MP3 я использовал эту функцию, и несколько читателей пожаловались, что не могут скомпилировать проект — у них есть какая-то версия Delphi до Delphi 5.

Одним из способов решения этой проблемы является создание собственной версии этой подпрограммы — функции AddLastBackSlash.

Если проект должен быть скомпилирован на Delphi 5, вызывается IncludeTrailingBackslash. Если используются некоторые из предыдущих версий Delphi, мы моделируем функцию IncludeTrailingBackslash.

Это может выглядеть примерно так:

функция AddLastBackSlash (ул: строка) : строка; начать Результат: = IncludeTrailingBackslash (str); если Copy (str, Length (str), 1) = «» затем Результат: = ул еще Результат: = str + «»; конец;

При вызове функции AddLastBackSlash Delphi выясняет, какая часть функции должна использоваться, а другая часть просто пропускается.

Delphi 2008?

Delphi 2007 использует VER180 для обеспечения неразрывной совместимости с Delphi 2006, а затем добавляет VER185 для разработки, которая по каким-либо причинам должна быть нацелена на Delphi 2007.

Примечание. Каждый раз, когда интерфейс модуля изменяет код, использующий этот модуль, его необходимо перекомпилировать.Delphi 2007 — выпуск без прерываний, означающий, что файлы DCU из Delphi 2006 будут работать как есть.

$IfOpt — Директива компилятора Delphi

Язык:
Русский
English

Условная директива компиляции IFOPT

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

Синтаксис

Параметр «Переключатель» включает имя переключателя, сопровождаемое знаком «+» или «-«:

«Переключатель+» означает, что переключатель включен
«Переключатель-» означает, что переключатель выключен

Илон Маск рекомендует:  Вёрстка веб-страниц
Понравилась статья? Поделиться с друзьями:
Кодинг, CSS и SQL