ІНШІ ДИРЕКТИВИ: #undef, #if, #ifdef, #ifndef, #else І #endif
Ці директиви зазвичай використовуються при програмуванні великих модулів. Вони дозволяють призупинити дію більш ранніх визначень і створити файли, кожен з яких можна компілювати по-різному.
Директива #undef скасовує найостанніше визначення пойменованого макроозначення.
#undef BIG / * BIG тепер не визначений * /
#define HUGE 10 / * HUGE перевизначений як 10 * /
#undef HUGE / * HUGE знову дорівнює 5 * /
#undef HUGE / * HUGE тепер не визначений * /
Очевидно (ми сподіваємося), ви не будете компілювати файл, як в цьому прикладі. Припустимо, що у вас є великий стандартний файл, визначений директивою #include. який ви хотіли б використовувати, але для цього деякі з його визначень для однієї з функцій програми потрібно буде тимчасово змінити, Замість того щоб мати справу з цим файлом, ви можете просто включити його, а потім оточити таку виділяється функцію відповідними директивами #define і # undef.
Або, припустимо, що ви працюєте з великою системою програм. Ви хочете поставити макроозначень, але не впевнені, чи використовує ваше визначення інші визначення звідки-небудь з іншого місця системи. У цьому випадку просто скасуйте ваше макроозначень в тому місці, де воно вам більше не потрібно, а оригінал цього макроозначення, якщо він є, буде як і раніше залишатися в силі для іншої частини системи.
Інші згадані нами директиви дозволяють виконувати умовну компіляцію. Ось приклад:
#include "horse.h" / * виконається, якщо MAVIS визначено * /
#define STABLES 5
#include "cow.h" / * виконається, якщо MAVIS не визначений * /
#define STABLES 15
Директива #ifdef повідомляє, що якщо наступний ідентифікатор (MAVIS) визначається препроцесором, то виконуються всі наступні директиви аж до першої появи #else або #endif. Коли в програмі є #else. то програма від #else до #endif буде виконуватися, якщо ідентифікатор не визначений.
Така структура дуже нагадує конструкцію if-else мови Сі. Основна різниця полягає в тому, що препроцесор не розпізнає фігурні дужки <>. відзначають блок, тому що він використовує директиви #else (якщо є) і #endif (яка повинна бути) для позначки блоків директив.
Ці умовні конструкції можуть бути вкладеними.
Директиви #ifdef і #if можна використовувати з #else і #endif таким же чином. Директива #ifndef опитує, чи є наступний ідентифікатор невизначеним; ця директива протилежна #ifdef. Директива #if більше схожа на звичайний оператор if мови Сі. За нею йде константний вираз, яке вважається дійсним, якщо воно не дорівнює нулю:
Одна з цілей використання "умовної компіляції" - зробити програму більш мобільною. Змінюючи кілька ключових визначень на початку файлу, ви можете встановлювати різні значення і включати різні файли для різних систем.
Ці короткі приклади ілюструють дивовижну здатність мови Сі витончено і строго управляти програмами.