Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
+ООП_Навч_посібник.doc
Скачиваний:
8
Добавлен:
01.07.2025
Размер:
6.58 Mб
Скачать

23.1.2. Директива #error

Директива #error відображає повідомлення про помилку.

Директива #error дає вказівку компіляторові зупинити компіляцію. Вона використовується в основному для відлагодження. Загальний формат її запису є таким:

terror повідомлення

Звернемо Вашу увагу на те, що елемент повідомлення не поміщений у подвійні лапки. При зустрічі з директивою terror відображається задане повідомлення і інша інформація (вона залежить від конкретної реалізації робочого середовища), після чого компілювання припиняється. Щоб дізнатися, яку інформацію відображає у цьому випадку компілятор, достатньо провести експеримент.

23.1.3. Директива #include

Директива #include містить заголовок або інший початковий файл.

Директива препроцесора #include зобов'язує компілятор включити або стандартний заголовок, або інший початковий файл, ім'я якого вказане у директиві #include. Ім'я стандартних заголовків береться у кутові дужки, як це показано у прикладах, наведених у цьому навчальному посібнику. Наприклад, ця директива

#include <vector> // Для роботи контейнерним класом "Вектор"

містить стандартний заголовок для векторів.

При включенні іншого початкового файлу його ім'я може бути вказано у подвійних лапках або кутових дужках. Наприклад, наступні дві директиви зобов'язують C++ прочитати і скомпілювати файл з іменем strClass.h:

#include <strClass.h>

#include "strClass.h"

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

Якщо ж ім'я файлу поміщене в лапки, пошук файлу виконується, як правило, у поточному каталозі (що також визначено конкретною реалізацією). У багатьох випадках це означає пошук поточного робітника каталога. Якщо заданий файл не знайдений, пошук повторюється з використанням першого способу (неначебто ім'я файлу було поміщено у кутові дужки). Щоб ознайомитися з подробицями, пов'язаними з різною обробкою директиви #include у разі використання кутових дужок і подвійних лапок, зверніться до керівництва користувача, що додається до Вашого компілятора. Настанови #include можуть бути вкладеними в інші файли, що містяться.

23.2. Директиви умовного компілювання

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

23.2.1. Директиви #if, #else, #elif і #endif

Директиви #if, #ifdef, #ifndef, #else, #elif і #endif – це директиви умовного компілювання.

Головна ідея полягає у тому, що коли вираз, що знаходиться після директиви #if виявляється істинним, то буде скомпільований програмний код, розташований між нею і директивою #endif; інакше даний програмний код буде опущений. Директива #endif використовують для позначення кінця блоку #if.

Загальна форма запису директиви #if має такий вигляд:

#if константний_вираз

послідовність настанов

#endif

Якщо константний_вираз є істинним, програмний код, розташований безпосередньо за цією директивою, буде скомпільований. Розглянемо такий приклад.

Код програми 23.4. Демонстрація простого прикладу використання директиви #if

#include <iostream> // Для потокового введення-виведення

using namespace std; // Використання стандартного простору імен

#define MAX 100

int main()

{

#if MAX>10

cout << "Потрібний додаткова память\n";

#endif

//...

getch(); return 0;

}

У процесі виконання ця програма відобразить повідомлення Потрібна додаткова пам'ять на екрані, оскільки, як визначено у програмі, значення константи МАХ більше 10. Цей приклад ілюструє важливий момент: Вираз, який знаходиться після директиви #if, обчислюється під час компілювання. Отже, воно повинно містити тільки ідентифікатори, які були заздалегідь визначені, або константи. Використання ж змінних тут виключене.

Поведінка директиви #else багато в чому подібно до поведінки настанови else, яка є частиною мови програмування C++: вона визначає альтернативу на випадок невиконання директиви #if. Щоб показати, як працює директива #else, скористаємося попереднім прикладом, небагато його розширивши.

Код програми 23.5. Демонстрація механізму використання директив #if і #else

#include <iostream> // Для потокового введення-виведення

using namespace std; // Використання стандартного простору імен

#define MAX 6

int main()

{

#if MAX>10

cout << "Потрібна додаткова пам'ять.\n");

#else

cout << "Достатньо набезпосередньої пам'яті.\n";

#endif

//...

getch(); return 0;

}

У цій програмі для імені МАХ визначено значення, яке 10, тому #if-гілка коду програми не скомпілюється, та зате скомпілюється альтернативна #else-гілка. В результаті відобразиться повідомлення Достатньо набезпосередньої пам'яті.

Звернемо Вашу увагу на те, що директива #else використовують для індикації одночасно як кінця #if-блока, так і початку #еlse-блоку. У цьому є логічна необхідність, оскільки тільки одна директива #endif може бути пов'язана з директивою #if.

Директива #elif еквівалентна зв'язці настанов else-if і використовують для формування багатоланкової схеми if-else-if, представляючої декілька варіантів компілювання. Після директиви #elif повинен знаходитися константний вираз. Якщо цей вираз істинний, наступний блок коду програми скомпілюється, і ніякі інші ttelif-вирази не тестуватимуться або не компілюватимуться. Інакше буде перевірено наступне по черзі

#elif -вираз. Ось як виглядає загальний формат використання директиви

#elif.

#if вираз

послідовність настанов

#elif вираз 1

послідовність настанов

#elif вираз 2

послідовність настанов

#elif вираз 3

послідовність настанов

//...

#elif вираз N

послідовність настанов

#endif

Наприклад, цей фрагмент коду програми використовується ідентифікатор COMPILED_BY, який дає змогу визначити, ким компілюється програма.

#define JOHN Про #define B_OBJ 1 #define ТОМУ 2

#define COMPILED_BY JOHN

#if COMPILED_BY == JOHN

char who[] = "John"; ttelif COMPILED_BY == B_OBJ

char who[] = "B_ob";

#else

char who[] = "Tom";

#endif

Директиви #if і #elif можуть бути вкладеними. У цьому випадку директива #endif, #else або #elif зв'язується з найближчою директивою #if або #elif. Наприклад, такий фрагмент коду програми є абсолютно допустимим.

#if COMPILED_BY == B_OBJ #if DEBUG == FULL int port = 198;

#elif DEBUG == PARTIAL

int port = 200;

#endif

#else

cout << "Боб повинен скомпілювати код"

<< "для відлагодження виведення даних.\n";

#endif