Макроси
Макрос – це ідентифікатор, що визначається за допомогою директиви препроцесора #define. Перед компіляцією програми замість ідентифікатора_макроса в програму підставляється текст заміни, що також становить ресурс. Допускається визначення макроса з аргументами або без аргументів. Макрос без аргументів обробляється аналогічно символічній константі. В макросі з аргументами останні підставляються в текст заміни, після чого макрос розширюється, тобто в програму підставляється текст заміни замість ідентифікатора і списку аргументів. Розглянемо наступне макровизначення з одним аргументом для знаходження площі круга:
#define CIRCLE_AREA (x) ((PI)*(x)*(x))
Кожен раз, коли в програмному коді з’явиться CIRCLE_AREA (x), значення х підставляється замість х в тексті заміни, символічна константа РІ автоматично заміняється її значенням (визначеним раніше), і макрос розширюється в програмі. Наприклад, оператор
area=CIRCLE_AREA (4)
розширюється в
area=((3.14159)*(4)*(4));
Текст заміни для макроса чи символічної константи – це як правило довільний текст в лінійці після ідентифікатора в директиві #define. Якщо текст не поміщається в межах однієї лінійки, то в кінці лінійки доцільно помістити обернену косу лінію \ , яка б показувала, що текст продовжується на наступній лінійці. Символічні константи і макроси можна відмінити, використовуючи директиві препроцесора #undef. Ця директива відміняє визначення символічної константи або імені макроса. Область їх дії продовжується від місця їх визначення в програмному коді до місця відміни визначення їх за допомогою директиви #undef, чи до кінця файлу, якщо дана директива відсутня. Після дії директиви #undef дозволяється повторно визначати макрос за допомогою директиви #define. Функції-ресурси стандартної бібліотеки часто визначаються як макроси через інші стандартні бібліотечні функції. Так в заголовку stdio.h часто визначають макрос
#define getchar() getc(stdin).
Макровизначення getchar використовує функцію getc, щоб отримати один символ із стандартного потоку вводу. Функція putchar файла заголовку stdio.h і оперуючі з символами функції заголовочного файла ctype.h часто також реалізуються в виді макросів. Відмітимо, що вирази з побічними ефектами (тобто зі зміною значень змінних) не повинні розміщуватися в макроси, тому що аргументи макросу можуть оцінюватися більше одного разу.
Макрос підтвердження
Макрос assert, що визначений в заголовковому бібліотечному файлі assert.h, перевіряє значення виразу. Якщо значення виразу рівне 0 (хибне значення), то assert роздруковує повідомлення про помилку і викликає функцію abort (із бібліотеки загального призначення stdlib.h), що завершує роботу програми. Це дуже корисний інструмент відладки програми, що дозволяє провіряти, чи має змінна вірне значення. Припустимо, що значення змінної х в програмі ніколи не повинно перевищувати 10. Для перевірки значення х і видачі повідомлення про помилку у випадку, якщо х приймає недопустимі значення, можна скористатися макросом підтвердження. Відповідний оператор буде мати наступний вигляд:
assert (х<=10);
Якщо при виконанні цього оператора х більше 10, то видається повідомлення, яке містить номер лінійки і ім’я файла, а виконання програми при цьому переривається. Після цього програміст може обмежити пошуки помилки в даній частині коду. Якщо визначена символічна константа NDEBUG, то наступні оператори підтвердження будуть ігноруватися. Таким чином, коли оператори підтвердження уже не потрібні, замість того, щоб видалити їх вручну, досить в програмний файл вставити лінійку:
#define NDEBUG.
Операції, що застосовуються в директивах препроцесора.
