Макроси в З++
Int xx = 0; // локальна переменная. Int xx = 0; // глобальний счетчик. INCR_xx; // збільшує локальний xx. Expanded = argument1: foo bar argument2: yuk yuk. Define mac (a, b) argument1: a argument2: b. После розширення дасть: После розширення дасть. Xx = SQUARE (xx+2); // xx = xx+2*xx+2. Define MIN (a, b) (((a)<(b))?(a):(b)). Expanded = mac (foo bar, yuk yuk). If (a-DISP==b) { // a-= 4==b. Define… Читати ще >
Макроси в З++ (реферат, курсова, диплом, контрольна)
Макросы в C++
Макросы в З вони важливі, але у З++ застосовуються набагато менше. Перше правило щодо них таке: не використовуйте їх, коли ви не зобов’язані це робити. Як зазначалося, кожен макрос виявляє свій недолік чи мові, чи програмі. Коли хочете використовувати макроси, прочитайте, будь ласка, спочатку дуже ретельно посібник з вашої реалізації З препроцесора.
Простой макрос визначається так:
#define name rest of line.
Когда name зустрічається як лексема, воно замінюється на rest of line.
Например:
named = name.
после розширення дасть:
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.
Макросы обробляють рядки — і про синтаксисі З++ знають обмаль, йдеться про типах З++ чи областях видимості - нічого. Компілятор бачить лише розширену форму макросу, тому помилка в макросе діагностується коли макрос розширено, а чи не що він визначено. Внаслідок цього виникають незрозумілі повідомлення помилки.
Вот такими макроси можуть цілком:
#define Case break;case.
#define nl << «n «.
#define forever for (;;).
#define MIN (a, b) (((a)<(b))?(a):(b)).
Вот зовсім непотрібні макроси:
#define PI 3.141 593.
#define BEGIN {.
#define END }.
А ось приклади небезпечних макросів:
#define SQUARE (a) a*a.
#define INCR_xx (xx)++.
#define DISP = 4.
Чтобы побачити, що вони небезпечні, спробуйте провести розширення наступному прикладі:
int xx = 0; // глобальний счетчик.
void f () {.
int xx = 0; // локальна переменная.
xx = SQUARE (xx+2); // xx = xx+2*xx+2.
INCR_xx; // збільшує локальний xx.
if (a-DISP==b) { // a-= 4==b.
// …
}.
}.
Если ви змушені використовувати макрос, при засланні на глобальні імена використовуйте операцію дозволу області видимості: і укладайте входження імені параметра макросу в дужки скрізь, де може бути (див. MIN вище).
Обратите увагу до відмінність результатів розширення цих двох макросів:
#define m1(a) something (a) // глибокодумний комментарий.
#define m2(a) something (a) /* глибокодумний коментар */.
например,.
int a = m1(1)+2;
int b = m2(1)+2;
pасширяется в.
int a = something (1) // глибокодумний комментарий+2;
int b = something (1) /* глибокодумний коментар */+2;
С допомогою макросів ви можете розробити свій власний мову. Найімовірніше, ж для решти він незбагненний. З іншого боку, З препроцесор — дуже проста макропроцесор. Коли ж ви спробуєте зробити щось нетривиальное, ви, мабуть, знайдете, що зробити це або неможливе, або надзвичайно складно.
Список литературы
Для підготовки даної роботи було використані матеріали із сайту internet.