Ключи компиляции (директивы компилятора)
Ключ компиляции задает режим компиляции программы. Этот режим управляет синтаксическими требованиями к исходному тексту программы, а также поведением откомпилированного кода программы.
Ключ является глобальным, если в модуле он может присутствовать только в одном месте – в начале модуля. Режим, задаваемый глобальным ключом, действует на весь модуль.
Ключ является локальным, если в модуле он может присутствовать во многих местах. Режим, задаваемый локальным ключом, действует на тот участок кода, который предшествует прямо противоположному ключу.
Выравнивание полей записей и классов
{$A+}, {$A-}, {$A1}, {$A2}, {$A4}, or {$A8}
или
{$ALIGN ON}, {$ALIGN OFF}, {$ALIGN 1}, {$ALIGN 2}, {$ALIGN 4},
or {$ALIGN 8}
По умолчанию:
{$A8}
или
{$ALIGN 8}
Зона действия: Локальный
Полное вычисление логических выражений
{$B+} or {$B-}
или
{$BOOLEVAL ON} or {$BOOLEVAL OFF}
По умолчанию:
{$B-}
или
{$BOOLEVAL OFF}
Зона действия: Локальный
Пример
x := 3;
{$B-}
if
(x > 4) // Вычисляется
and
(x < 5) // НЕ вычисляется
then . . . ;
Использование длинных строк (AnsiString)
{$H+} or {$H-}
или
{$LONGSTRINGS ON} or {$LONGSTRINGS OFF}
По умолчанию:
{$H+}
или
{$LONGSTRINGS ON}
Зона действия: Локальный
Проверка результата ввода-вывода
{$I+} or {$I-}
или
{$IOCHECKS ON} or {$IOCHECKS OFF}
По умолчанию:
{$I+}
или {$IOCHECKS ON}
Зона действия: Локальный
Применён в проекте OptPathRDLU.
Разрешение использовать типизированные константы как переменные
{$J+} or {$J-}
или
{$WRITEABLECONST ON} or {$WRITEABLECONST OFF}
По умолчанию:
{$J-}
или
{$WRITEABLECONST OFF}
Зона действия: Локальный
Ключ {$J+} применён в проектах KnightTurns и OptPathRDLU.
Генерация информации о текущих типах полей, методов, свойств, объявленных в секции Published (RTTI, RunTime Type Information)
{$M+} or {$M-}
или
{$TYPEINFO ON} or {$TYPEINFO OFF}
По умолчанию:
{$M-}
или
{$TYPEINFO OFF}
Зона действия: Локальный
Если класс объявлен в режиме {$M-}, или не является потомком класса, объявленного в режиме {$M+}, секция Published запрещена.
Задание размера стека
{$M <Число: Мин. размер стека>, < Число: Макс. размер стека>}
или
{$MINSTACKSIZE <Число>}
{$MAXSTACKSIZE <Число>}
По умолчанию:
{$M 16384, 1048576}
Зона действия: Глобальный
1024 ≤ <Число: Мин. размер стека> ≤ 2147483647
<Число: Мин. размер стека> ≤ <Число: Макс. размер стека> ≤ 2147483647
Проверка выхода за пределы диапазона
{$R+} or {$R-}
или
{$RANGECHECKS ON} or {$RANGECHECKS OFF}
По умолчанию:
{$R-}
или
{$RANGECHECKS OFF}
Зона действия: Локальный
Пример. TP7
var
i: integer;
mA, nB: array[1..10] of integer;
begin
for i := 1 to 10 do begin mA[i] := 0; mB[i] := 0; end;
{$R-}
i := 12;
mA[i] := -7;
writeln(mA[i]); // -7
writeln(mB[2]); // -7
{$R+}
mA[i] := -7; // RunTime Error
writeln(mA[12]); // Constant Out Of Range
end.
Проверка переполнения при арифметических операциях
{$Q+} or {$Q-}
или
{$OVERFLOWCHECKS ON} or {$OVERFLOWCHECKS OFF}
По умолчанию:
{$Q-}
или
{$OVERFLOWCHECKS OFF}
Зона действия: Локальный
Пример. TP7
var
L: integer;
begin
L := 2000000000;
{$Q-}
L := L*L; // Реакции на переполнение нет
writeln(L); // -1651507200
L := 1000000000;
{$Q+}
L := L*L; // RunTime Error
end.
Разрешение использовать расширенный синтаксис
{$X+} or {$X-}
или
{$EXTENDEDSYNTAX ON} or {$EXTENDEDSYNTAX OFF}
По умолчанию:
{$X+}
или
{$EXTENDEDSYNTAX ON}
Зона действия: Глобальный
Пример 1. TP7
{$X+}
var
p: pChar; // То же, что p = ^Char;
const
mC: array[0..39] of char = 'Petrov'#0; // Синтаксическая ошибка при {$X-}
begin
// Во ВСЕХ последующих операторах
// будет выявлена синтаксическая ошибка при ключе {$X-}
// При ключе {$X+} код нормально компилируется и работает.
p := 'Nikolaev';
writeln(Ord(p[8])); // 0
writeln(p);
p := @mC;
writeln(p);
writeln(p[0]);
end.
Пример 2. TP7
{$X+}
uses crt;
var
c: char;
x, y: double;
begin
c := readkey;
ReadKey; // Синтаксическая ошибка при {$X-}
x := pi/2; y := sin(x);
sin(x); // Синтаксическая ошибка в любом случае
end.
Пример 3. Delphi
{$X+}
function Factorial(N: longint): longint;
var i: longint;
begin
Result := 1; // Синтаксическая ошибка при {$X-}
for i := 2 to N do Result := Result * i; // Синтаксическая ошибка при {$X-}
end;