Макроси в C вони дуже важливі, але в C ++ застосовуються набагато менше. Перше правило щодо них таке: не використовуйте їх, якщо ви не зобов'язані це робити. Як було відмічено, майже кожен макрос проявляє своя вада або в мові, або в програмі. Якщо ви хочете використовувати макроси, прочитайте, будь ласка, спочатку дуже уважно керівництво по вашій реалізації C препроцесора.
Простий макрос визначається так:
#define name rest of line
Коли name зустрічається як лексема, воно замінюється на rest of line.
після розширення дасть:
named = rest of line
Можна також визначити макрос з параметрами.
#define mac (a, b) argument1: a argument2: b
При використанні mac має даватися два рядки параметра. Після розширення mac () вони замінюють a і b.
expanded = mac (foo bar, yuk yuk)
expanded = argument1: foo bar argument2: yuk yuk
Макроси обробляють рядки і про синтаксис C ++ знають дуже мало, а про типи C ++ або областях видимості - нічого. Компілятор бачить тільки розширену форму макросу, тому помилка в макросі діагностується коли макрос розширено, а не коли він визначений. В результаті цього виникають незрозумілі повідомлення про помилки.
Ось такими макроси можуть бути цілком:
#define Case break; case
#define nl <<"\n"
#define forever for (;;)
Ось зовсім непотрібні макроси:
#define PI 3.141593
А ось приклади небезпечних макросів:
#define SQUARE (a) a * a
#define INCR_xx (xx) ++
Щоб побачити, чим вони небезпечні, спробуйте провести розширення в наступному прикладі:
int xx = 0; // глобальний лічильник
int xx = 0; // локальна змінна
xx = SQUARE (xx + 2); // xx = xx + 2 * xx + 2
INCR_xx; // збільшує локальний xx
if (a-DISP == b)
Якщо ви змушені використовувати макрос, при посиланні на глобальні імена використовуйте операцію дозволу області видимості. і укладайте входження імені параметра макросу в дужки скрізь, де це можливо (див. MIN вище).
Зверніть увагу на відмінність результатів розширення цих двох макросів:
За допомогою макросів ви можете розробити свою власну мову. Швидше за все, для всіх інших він буде незбагненний. Крім того, C препроцесор - дуже простий макропроцесор. Коли ви спробуєте зробити що-небудь нетривіальне, ви, ймовірно, виявите, що зробити це або неможливо, або надзвичайно важко.