Програмування С, С++теорія та практика (частина 1)
1.18.4 Директиви #іґ, #еІії, #еІ8в, #епгіії
Умовна компіляція дає можливість програмісту керувати виконанням директив препроцесора і компіляцією програмного коду. Кожна умовна директива препроцесора обчислює значення
цілочисельного константного виразу.
Умовна директива препроцесора #іґ багато в чому схожа на оператор і/. її синтаксис має вигляд :
#і1 умова
[ #еІіі умова
[ #еІіі умова .]
[ #еІзе .]
#епСі1
Умова - це цілочисельний вираз. Якщо цей вираз повертає не нуль (істинно), то фрагмент коду, що розташований між директивою #іґ і директивою #епгїі:Т, компілюється. Якщо ж вираз повертає нуль (хибно), то цей фрагмент коду ігнорується і препроцесором, і компілятором.
В умовах, окрім звичайних виразів, можна використовувати конструкцію :
СеІіпеС (ідентифікатор)
гіе/іпегі повертає 1, якщо вказаний ідентифікатор раніше був визначений директивою #гїейпе, і повертає 0 в протилежному випадку.
Кількість директив #е1іґ - довільна. Якщо директива #е1§е присутня, то між нею і директивою #епйіґ на даному рівні вкладеності не повинно бути інших директив #е1іґ.
Приклад 1:
#і£ гіе£іпегі(СКЕБІТ) сгейі'Ь () ;
#е1і£ йе£іпей (БЕБІТ) гіеЬі'Ь () ;
#е1зе
ргіп^еггог();
#епйі£
В наведеному прикладі директиви #іГ, #е1і£, #е1§е, #епгїі£ керують викликом однієї з трьох викликів функцій. Виклик функції стейіі() скомпілюється, якщо визначена іменована константа СКЕБІТ. Якщо визначена іменована константа БЕБІТ, то скомпілюється виклик функції йеЬіі(). Якщо жодна із наведених іменованих констант не визначена, то скомпілюється виклик функції ргіпіеггог().
Приклад 2.
#і£ ^^ЕVЕ^>5 #гіе£іпе 8ІЄНАІ1 1 #і£ 8ТАСКЛ8Е == 1 #гіе£іпе 8ТАСК 200 #е1зе
#гіе£іпе 8ТАСК 100 #епйі£
#е1зе
#гіе£іпе 8ІЄИАІІ 0 #і£ 8ТАСКЛ8Е == 1 #гіе£іпе 8ТАСК 100 #е1зе
#гіе£іпе 8ТАСК 50 #епйі£
#епйі£
В другому прикладі показано два вкладених набори директив #іГ, #ЄІ8Є, #епгїіґ. Перший набір директив оброблюється, якщо значення БЬЕУЕЬ більше за 5. В протилежному випадку оброблюється другий набір.
12 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99
