директиви компілятора

У меню OPTIONS / COMPILER включені опції, за допомогою яких можна управляти роботою компілятора. У ряді випадків буває необхідно тимчасово скасувати дію тієї чи іншої опції при трансляції деякого фрагмента програми. Особливо часто, наприклад, така необхідність виникає при зверненні до диска: якщо програма намагається прочитати неіснуючий файл або записати дані на захищений диск, виникне помилка періоду виконання і програма аварійно закінчить свою роботу. У той же час, якщо відключити опцію I / O CHECKING, цього не станеться, програма зможе проаналізувати наслідки звертання до диска і зробити альтернативні дії.

Перемикаюча директива містить букву, що позначає опцію, і знак «+» або «-». Знак «+» означає установку опції в активний стан, знак «-» - в пасивний стан. Наприклад, директива означає тимчасове відключення контролю помилок введення-виведення, директива - включення контролю кордонів діапазону. В одній директиві можна перерахувати кілька опцій, наприклад:

Слід врахувати, що директиви компілятора діють від моменту своєї появи в тексті до кінця поточного модуля, тобто локалізуються в тілі модуля, в той час як опції, встановлені в самому середовищі, поширюються на всі модулі і основну програму. У разі конфлікту між директивами і опціями, перевага віддається директивам. Таким чином, правильно розставлені директиви забезпечують потрібну компіляцію програми незалежно від настройки середовища. Вони особливо корисні в разі, коли компіляція здійснюється автономним компілятором ТР.ЕХЕ.

Деякі директиви компілятора можуть діяти тільки на частину тексту програми, такі директиви називаються локальними; на відміну від цього глобальні директиви розташовуються на самому початку тексту програми (модуля) і діють відразу на всю програму (модуль) в цілому.

Нижче наводиться список всіх директив компілятора. У дужках дається відповідають вимогам Директиви ЄС для знака «-». Знаком * відмічені локальні директиви.

- вирівнювати дані на кордон слова (байти);

* - обчислювати логічні вирази повністю (до отримання результату);

- дозволити (заборонити) роботу з вбудованим отладчиком;

- включити (відключити) режим програмної емуляції співпроцесора;

- використовувати дальню (ближню) модель виклику;

* - використовувати (не використовувати) повний набір команд мікропроцесора Intel 80286 (мікропроцесора Intel 8088);

* - включити (відключити) контроль операцій введення-виведення;

- включити (не включати) локальні символи в інформацію для відладчика;

- використовувати числовий співпроцесор (реалізувати операції з плаваючою точкою програмно);

- дозволити (не дозволяти) створення оверлейной структури;

* - включити (відключити) контроль кордонів діапазону;

* - включити (відключити) контроль можливого переповнення стека;

* - включити (відключити) контроль довжини рядків при зверненні до процедури або функції;

- використовувати (не використовувати) розширений синтаксис.

До умовних директив відносяться такі локальні директиви компілятора:

- перевірити установку умовного символу; якщо символ встановлений, компілюватиметься вся наступна за директивою частина програми аж до директив або, в іншому випадку цей фрагмент програми буде пропущений компілятором;

- визначає початок альтернативного фрагмента програми; цей фрагмент компілюватиметься в тому випадку, якщо умовний символ, перевірений попередньої по тексту програми директивою пли, не встановлено; альтернативна частина разом з директивою може опускатися;

- обмежує область дії директив, або.

Встановити умова - це значить за допомогою опції OPTIONS / COMPILER / CONDITIONAL DEFINES середовища Турбо Паскаля або за допомогою директиви компілятора ввести деякий слово (умовний символ), яке потім буде управляти компіляцією якогось фрагмента програми. Якщо, наприклад, використовувати в якості умовного символу слово DEBUG, то можна написати такий фрагмент програми:

WriteLn ( 'Налагодження: х =, х);

Тепер, якщо встановлений (заданий в середовищі або введений за допомогою директиви) умовний символ DEBUG, в програмі буде откомпилирован оператор WRITELN, якщо цей умовний символ не заданий, компілятор пропустить цей оператор.

Відзначимо, що умовні символи ніяк не пов'язані з безліччю ідентифікаторів самої програми і недоступні їй на етапі виконання. Для попереднього прикладу можна написати

якщо, зрозуміло, в програмі не визначена змінна або константа з цим ім'ям.

Одночасно в програмі може бути встановлено скільки завгодно умовних символів. Для тестування декількох умов використовується вкладення умовних директив компілятора, наприклад:

У директивах або програміст може використовувати такі стандартні умовні символи, які встановлюються в середовищі автоматично:

VER70 - вказує версію 7.0 Турбо Паскаля (для інших версій використовуються інші умовні символи: VER40, VER50, VER55, VER60);

MSDOS - вказує на те, що програма буде виконуватися під управлінням операційної системи MSDOS (PC DOS); версії Турбо Паскаля для інших операційних систем НЕ будуть встановлювати цей символ;

CPU86 - вказує на те, що програма буде виконуватися на ПК з процесором, що належить сімейству Intel 80x86;

CPU87 - вказує на те, що в складі апаратних засобів ПК виявлений (до моменту компіляції програми!) Арифметичний співпроцесор сімейства Intel 80x87.

До параметричних відносяться директиви:

- встановити необхідні розміри пам'яті (глобальна директива); тут <стек> - розмір стека; <нижн> - нижня межа динамічної пам'яті; <верх> - верхня межа динамічної пам'яті;

- включення PAS-файлу: <имя файла> - ім'я файлу, що включається;

- включення OBJ-файлу: <имя файла> - ім'я файлу, що включається.

У директиві все розміри задаються в байтах, слідують один за одним у зазначеній послідовності і відокремлюються комами. Між буквою М і першою цифрою розміру стека повинен бути хоча б один пробіл, між останньою цифрою верхньої межі динамічної пам'яті і закриває фігурної дужки не повинно бути ніяких символів, наприклад:

Директива ($ L) призначена для вказівки компілятору файлу, в якому міститься результат трансляції ассемблерной процедури або функції, оголошеної в програмі як зовнішня