Є кілька директив, які дають можливість вибірково компілювати частини вихідного коду вашої програми. Цей процес називається умовною компіляцією і широко використовується фірмами, що живуть за рахунок комерційного програмного забезпечення - тими, які постачають і підтримують багато спеціальні версії однієї програми.
Директиви #if, #else, #elif і #endif
Можливо, найпоширенішими директивами умовної компіляції є #if. #else. #elif і #endif. Вони дають можливість в залежності від значення константного виразу включати або виключати ті або інші частини коду.
У загальному вигляді директива #if виглядає таким чином:
Якщо знаходиться за #if константне вираз істинний, то компілюється код, який знаходиться між цим виразом і #endif. В іншому випадку цей проміжний код пропускається. Директива #endif позначає кінець блоку #if. наприклад,
Це програма виводить повідомлення на екран, тому що МАХ більше 99. Цей приклад демонструє щось дуже важливе. Значення виразу, що знаходиться за директивою #if. має бути обчислено під час компіляції. Тому в цьому виразі можуть перебувати тільки раніше певні ідентифікатори і константи, - але не змінні.
Директива #else працює в основному так, як else - ключове слово мови С: задає альтернативу на той випадок, якщо не виконана умова #if. Попередній приклад можна доповнити наступним чином:
В цьому випадку з'ясовується, що МАХ менше 99, тому частина коду, що відноситься до #if. НЕ компілюється. Однак компілюється альтернативний код, що відноситься до #else. і відкомпілювати програма буде відображати повідомлення компілює для невеликого масиву.
Зверніть увагу, що директива #else використовується для того, щоб позначити і кінець блоку #if. і початок блоку #else. Це природно, оскільки будь-який директиві #if може відповідати тільки одна директива #endif.
Директива #elif означає "else if" і встановлює для безлічі варіантів компіляції ланцюжок if-else-if. Після #elif знаходиться константний вираз. Якщо цей вислів істинно, то компілюється знаходиться за ним блок коду, і більше не перевіряються ніякі інші вирази #elif. В іншому ж випадку перевіряється наступний блок цієї послідовності. У загальному вигляді #elif виглядає таким чином:
Наприклад, в наступному фрагменті для визначення знака грошової одиниці використовується значення ACTIVE_COUNTRY (для якої країни):
Відповідно до стандарту С89 у директив #if і #elif може бути не менше 8 рівнів вкладеності. А відповідно до стандарту С99 програмістам дозволяється використовувати не менше 63 рівнів вкладеності. При вкладеності кожна директива #endif. #else або #elif відноситься до найближчої директиві #if або #elif. Наприклад, абсолютно правильним є наступний фрагмент коду:
Директиви #ifdef і #ifndef
Інший спосіб умовної компіляції - це використання директив #ifdef і #ifndef. які відповідно означають "if defined" (якщо визначено) і "if not defined" (якщо не визначено). У загальному вигляді #ifdef виглядає таким чином:
Блок коду компілюватиметься, якщо ім'я макросу було визначено раніше в операторі #define.
У загальному вигляді оператор #ifndef виглядає таким чином:
Блок коду компілюватиметься, якщо ім'я макросу ще не визначено в операторі #define.
І в #ifdef. і в #ifndef можна використовувати оператор #else або #elif. наприклад,
виведе Привіт, Тед. а також A RALPH не визначений, т.ч. Ральфу не пощастило.