Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Розділ 10. Базові засоби мови С++.docx
Скачиваний:
6
Добавлен:
01.05.2019
Размер:
366.53 Кб
Скачать

3 Директива #undef

Синтаксис :

#undef ідентифікатор

Визначення символічних констант і макросів можуть бути анульовані за допомогою директиви препроцесора #undef. Таким чином, область дії символічної константи або макросу починається з місця їх визначення і закінчується явним їх анулюванням директивою #undef або кінцем файлу.

Після анулювання ідентифікатор може бути знову використаний директивою #define.

Приклад :

#define WIDTH 80

/* … */

#undef WIDTH

/* … */

#define WIDTH 20

4 Директиви #if, #elif, #else, #endif

Умовна компіляція дає можливість програмісту керувати виконанням директив препроцесора і компіляцією програмного коду. Кожна умовна директива препроцесора обчислює значення цілочисельного константного виразу.

Умовна директива препроцесора #if багато в чому схожа на оператор if. Її синтаксис має вигляд :

#if умова

...

[ #elif умова

…]

[ #elif умова

…]

[ #else

…]

#endif

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

В умовах, окрім звичайних виразів, можна використовувати конструкцію :

defined (ідентифікатор)

defined повертає 1, якщо вказаний ідентифікатор раніше був визначений директивою #define, і повертає 0 в протилежному випадку.

Кількість директив #elif - довільна. Якщо директива #else присутня, то між нею і директивою #endif на даному рівні вкладеності не повинно бути інших директив #elif.

Приклад 1:

#if defined(CREDIT)

credit();

#elif defined (DEBIT)

debit();

#else

printerror();

#endif

В наведеному прикладі директиви #if, #elif, #else, #endif керують викликом однієї з трьох викликів функцій. Виклик функції credit() скомпілюється, якщо визначена іменована константа CREDIT. Якщо визначена іменована константа DEBIT, то скомпілюється виклик функції debit(). Якщо жодна із наведених іменованих констант не визначена, то скомпілюється виклик функції printerror().

Приклад 2.

#if DLEVEL>5

#define SIGNAL 1

#if STACKUSE == 1

#define STACK 200

#else

#define STACK 100

#endif

#else

#define SIGNAL 0

#if STACKUSE == 1

#define STACK 100

#else

#define STACK 50

#endif

#endif

В другому прикладі показано два вкладених набори директив #if, #else, #endif. Перший набір директив оброблюється, якщо значення DLEVEL більше за 5. В протилежному випадку оброблюється другий набір.

5 Директиви #ifdef і #ifndef

Синтаксис :

#ifdef ідентифікатор

#ifndef ідентифікатор

Аналогічно директиві #if, за директивами #ifdef і #ifndef може слідувати набір директив #elif і директива #else. Набір директив повинен закінчуватися директивою #endif.

Використання директив #ifdef і #ifndef еквівалентне директиві #if, що використовує вираз з операцією defined (ідентифікатор). Ці директиви підтримуються виключно для сумісності з попередніми версіями компіляторів мови Сі. Тому замість цих директив рекомендується використовувати директиву #if з операцією defined (ідентифікатор).

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

Директива #ifndef протилежна за своєю дією директиві #ifdef. Якщо ідентифікатор не був визначений директивою #define, або його дія відмінена директивою #undef, то умова вважається істинною. В протилежному випадку умова хибна.