Макроси в C + + h2>
Макроси в C вони дуже важливі, але в C + + застосовуються набагато
менше. Перше правило щодо них таке: не використовуйте їх, якщо ви не
зобов'язані це робити. Як було відмічено, майже кожен макрос проявляє свій вада
або в мові, або у програмі. Якщо ви хочете використовувати макроси, прочитайте,
будь ласка, спочатку дуже уважно керівництво по вашій реалізації C
препроцесора. p>
Простий макрос визначається так: p>
# define name rest of line p>
Коли name зустрічається як лексема, воно замінюється на
rest of line. p>
Наприклад: p>
named name = p>
після розширення дасть: p>
named = rest of line p>
Можна також визначити макрос з параметрами. p>
Наприклад:
p>
# define mac (a, b) argument1: a argument2: b p>
При використанні mac повинно даватися два рядки
параметра. Після розширення mac () вони замінюють a і b. p>
Наприклад:
p>
expanded = mac (foo bar, yuk yuk) p>
після розширення дасть p>
expanded = argument1: foo bar argument2: yuk yuk p>
Макроси обробляють рядки і про синтаксис C + + знають
дуже мало, а про типи C + + або областях видимості - нічого. Компілятор бачить
тільки розширену форму макросу, тому помилка в макросі діагностується
коли макрос розширений, а не коли він визначений. В результаті цього виникають
незрозумілі повідомлення про помилки. p>
Ось такими макроси можуть бути цілком: p>
# define Case break; case p>
# define nl << "n" p>
# define forever for (;;) p>
# define MIN (a, b) (((a) <(b))? (a): (b)) p>
Ось зовсім непотрібні макроси: p>
# define PI 3.141593 p>
# define BEGIN ( p>
# define END) p>
А ось приклади небезпечних макросів: p>
# define SQUARE (a) a * a p>
# define INCR_xx (xx )++ p>
# define DISP = 4 p>
Щоб побачити, ніж вони небезпечні, спробуйте провести
розширення в наступному прикладі: p>
int xx = 0;
//Глобальний лічильник p>
void f () ( p>
int xx = 0;// локальна змінна p>
xx = SQUARE (xx 2);// xx = xx 2 * xx 2 p>
INCR_xx;// збільшує локальний xx p>
if (a-DISP == b)
(//A-= 4 == b p>
// ... p>
) p>
) p>
Якщо ви змушені використовувати макрос, при посиланні на
глобальні імена використовуйте операцію дозволу області видимості:: і укладайте входження імені параметра макросу
в дужки скрізь, де це можливо (див. MIN вище). p>
Зверніть увагу на відмінність результатів розширення цих
двох макросів: p>
# define m1 (a) something (a)// складний
коментар p>
# define m2 (a) something (a)/* глибокодумний
коментар */ p>
наприклад, p>
int a = m1 (1) +2; p>
int b = m2 (1) +2; p>
розширює в p>
int a = something (1)// складний коментар 2; p>
int b = something (1)/* глибокодумний коментар
*/2; p>
За допомогою макросів ви можете розробити свій власний
мова. Швидше за все, для всіх інших він буде незбагненний. Крім того, C
препроцесор - дуже простий Макропорцесори. Коли ви спробуєте зробити
що-небудь нетривіальне, ви, мабуть, знайдете, що зробити це або неможливо,
або надзвичайно важко. p>
Список літератури h2>
Для підготовки даної роботи були використані матеріали
з сайту http://www.realcoding.net
p>