Макроси в c

Макроси в 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 препроцесор - дуже простий макропроцесор. Коли ви спробуєте зробити що-небудь нетривіальне, ви, ймовірно, виявите, що зробити це або неможливо, або надзвичайно важко.

Схожі статті