Використання директив препроцесору (таких як: #include), обов’язково у програмі. Усі директиви починаються зі знаку п, котрому в рядку може передувати тільки пробіли. Після директиви знак; не ставиться. Розглянемо найуживаніші директиви.
• #define – директива, що вказує на заміну ідентифікатора у програмі числовою або текстовою константою. Коли ідентифікатор замінюється деякою послідовністю дій, він має назву макрос (макровизначення)..
Обов’язковою умовою є існування усіх учасників заміни у вигляді окремих лексем.
Функціонально макрос аналогічний вбудованій функції. Перевага вбудованої функції перед макросом у тому, що виклик функції перевіряється компілятором на відповідність типів аргументів.
• ## - визначає операцію, яка здійснює “склейку” лексем. Наприклад, #define SS(x, y) при виклику SS(a, 5) утворює ідентифікатор а5.
• # - визначає операцію, що перетворює підставлену лексему у символьний рядок. Використовується тільки у макросі з аргументом. Приклад, директива # define HELLO(x) cout<<“Привіт, “ #x
|
|
у тексті програми підставити замість HELLO (приятель) рядок
cout<<“Привіт, “ “приятель”
Рядок, що розділений пробілом, при попередній обробці “склеюється”, і в результаті отримуємо: cout<<“Привіт, приятель”;
• # undef - директива, яка відміняє дію поточного визначення # define. Структура директиви має вигляд: # undef пробіл ідентифікатор
Таким чином, область дії символьної константи або макросу починається від місту їх визначення # define та закінчується містом відміни # undef
• # include – директива, що включає у програму файли:
# include пробіл <ім’я файлу>
# include пробіл “ім’я файлу”
Ці директиви можуть бути вкладеними, і ця її властивість багатократно використовувалась при форматуванні бібліотеці програміста.
Директиви препроцесору організують режими умовної компіляції.
• вже відоме сполучення директив:
#ifndef WORD
# define WORD
…………………
#endif
виключають повторне включення файлів.
Аналогічно можна виключити повторне визначення констант:
#ifndef e
#definef e 2.71828
#endif
Ifndef – скорочений запис виразу if!define (коли не визначено).
• для перевизначення констант можна використовувати набір директив:
#ifdef e
#undef e
#definef e 1828
#endif
Ifdef – скорочений запис виразу if defined (коли визначено). Кожна директива #if повинна супроводжуватися своєю #endif.
Операції приведення типів, sizeof та константи enum не повинні приймати участь у виразах, обчислюваних у директивах препроцесору.
• Набір директив може виключити фрагмент програми із процесу компіляції.
# if 0
Фрагмент програми, що виключається
#endif
Для включення фрагмента у процес компіляції достатньо змінити 0 на 1.
|
|
Можна використовувати варіант:
#ifdef DB
Фрагмент програми, що виключається
#endif
Коли константа DB визначена, текст між директивами включається у процес компіляції, а коли не визначена – виключається.
Обробка програми препроцесором здійснюється до компіляції. Виконуються усі підстановки, а рядки, що містять #define та #undef, замінюються і стають порожніми. На місце рядків # include підставляється вміст файлу, що включається. Виконується обробка директив умовної компіляції, а рядки, їх вміст, замінюються порожніми. Порожніми замінюються також рядки, вміст яких виключається у процесі умовної компіляції.
Оглядові запитання
1. Що робить операцію розмітки, коли її застосувати до заповненої бази даних?
2. Чи використання директив препроцесору (таких як: #include), обов’язково у програмі?
3. Після директиви знак; ставиться чи ні?
4. Чим відрізняється функціонально макрос від вбудованій функції?
5. Чи приймають участь у виразах, обчислюваних у директивах препроцесору, операції приведення типів, sizeof та константи enum?
6. Що достатньо змінити для включення фрагмента у процес компіляції?
7. Коли здійснюється обробка програми препроцесором?