Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекция по информатике №8.doc
Скачиваний:
0
Добавлен:
24.11.2019
Размер:
149.5 Кб
Скачать

Ключи компиляции (директивы компилятора)

Ключ компиляции задает режим компиляции программы. Этот режим управляет синтаксическими требованиями к исходному тексту программы, а также поведением откомпилированного кода программы.

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

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

Выравнивание полей записей и классов

{$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;