Довідник по C / C ++
#if, #ifdef, #ifndef, #else, #elif і #endif
Директиви #if, #ifdef, #ifndef, #else, #elif і #endif використовуються для виборчої компіляції різних фрагментів програми. Головна ідея полягає в тому, що якщо вираз, що стоїть після директив #if, #ifdef і #ifndef, виявляється істинним, то буде скомпільовано код, розташований між однією з цих трьох директив і директивою #endif; в іншому випадку даний код буде опущений. Директива #endif використовується для позначення кінця блоку #if. Директиву #else можна використовувати з будь-якою з перерахованих вище директив для надання альтернативного варіанту компіляції.
Загальна форма запису директиви #if виглядає так.
Якщо константний вираз є істинним, буде скомпільовано код, розташований безпосередньо за цією директивою.
Загальна форма запису директиви #ifdef така.
Якщо імя_макроса визначено в операторі #define, то буде скомпільовано блок коду, наступний за оператором #ifdef.
Загальна форма запису директиви #ifndef така.
Якщо імя_макроса не визначене в операторі #define, то буде скомпільовано блок коду, наступний за оператором #ifndef.
Ось приклад спільної роботи деяких директив препроцесора.
В результаті виконання цього фрагмента програми на екран будуть виведені фрази "Привіт", "Тед" і "Привіт, Джон", а фраза "Привіт, Жорж" - немає.
Директива #elif використовується для створення оператора if-else-if. Його загальна форма має такий вигляд.
Для обробки відразу декількох альтернатив можна використовувати ряд директив # е1if.
За допомогою директив #if і #elif і оператора предпроцессорной обробки defined можна також з'ясувати, чи визначено ім'я конкретного макросу директивою препроцесора define. Для цього використовується наступна загальна форма запису.
Якщо імя_макроса визначено, последовательность_операторов буде скомпільована. В іншому випадку вона буде опущена. Наприклад, в наступному фрагменті умовний оператор компілюється, оскільки ім'я макросу DEBUG визначено в програмі.
Можна також оператор defined випередити оператором заперечення (!), І тоді умовна компіляція буде виконана в разі, якщо задане ім'я макросу не визначене.