Deprecated: mysql_connect(): The mysql extension is deprecated and will be removed in the future: use mysqli or PDO instead in /home/studb20/public_html/index.php on line 4
 1.18.2 Директива #йеіїпе - Програмування С, С++теорія та практика (частина 1) - Studbook

Програмування С, С++теорія та практика (частина 1)

1.18.2 Директива #йеіїпе

Синтаксис :

#сІе1їпе ідентифікатор текст

#сІе1їпе ідентифікатор (список_параметрів) текст

Директива #гїейпе заміняє всі входження ідентифікатора у програмі на текст, що слідує в директиві за ідентифікатором. Цей процес називається макропідстановкою. Ідентифікатор замінюється лише в тому випадку, якщо він представляє собою окрему лексему. Наприклад, якщо ідентифікатор є частиною рядка або більш довгого ідентифікатора, він не замінюється. Якщо за ідентифікатором слідує список параметрів, то директива визначає макровизначення з параметрами.

Текст представляє собою набір лексем, таких як ключові слова, константи, ідентифікатори або вирази. Один або більше пробільних символів повинні відділяти текст від ідентифікатора (або заключених в дужки параметрів). Якщо текст не вміщується в рядку, то він може бути продовжений на наступному рядку; для цього слід набрати в кінці рядка символ обернений слеш \ і зразу за ним натиснути клавішу Епґег.

Текст може бути опущений. В такому разі всі екземпляри ідентифікатора будуть вилучені з тексту програми. Але сам ідентифікатор розглядається як визначений і при перевірці директива #ІГ дає значення 1.

Список параметрів, якщо він заданий, містить один або більше ідентифікаторів, розділених комами. Ідентифікатори в рядку параметрів повинні відрізнятися один від одного. їх область дії обмежена макровизначенням. Список параметрів повинен бути заключений в круглі дужки. Імена формальних параметрів у тексті відмічають позиції, в які повинні бути підставлені фактичні аргументи макровиклику. Кожне ім’я формального параметра може з’явитися в тексті довільне число разів.

В макровиклику вслід за ідентифікатором записується в круглих дужках список фактичних аргументів, що відповідають формальних параметрам із списку параметрів. Текст модифікується шляхом заміни кожного формального параметра на відповідний фактичний параметр. Списки фактичних параметрів і формальних параметрів повинні мастити одне і те ж число елементів.

Примітка. Не слід плутати підстановку аргументів в макровизначеннях з передачею параметрів у функціях. Підстановка в препроцесорі носить чисто текстовий характер. Ніяких обчислень при перетворенні типу при цьому не виконується.

Вище вже говорилося, що макровизначення може містити більше одного входження даного формального параметра. Якщо формальний параметр представлений виразом з “побічним ефектом” і цей вираз буде обчислюватися більше одного разу, разом з ним кожний раз буде виникати і “побічний ефект”. Результат виконання в цьому випадку може бути помилковим.

Всередині тексту в директиві Мейпе можуть знаходитися вкладені імена інших макровизначень або констант.

Після того, як виконана макропідстановка, отриманий рядок знову переглядається для пошуку інших імен констант і макровизначень. При повторному перегляді не розглядається ім’я раніше проведеної макропідстановки. Тому директива #йе£іпе а а

не призведе до за циклювання препроцесора.

Приклад 1 :

#гіе£іпе ШБТН 80 #гіе£іпе ЬЕНбТН (ШБТН+10)

В даному прикладі ідентифікатор ЖГОТН визначається як ціла константа із значенням 80, а ідентифікатор ЬБМСТН - як текст (^ГОТН+10). Кожне входження ідентифікатора ЬБМСТН у програму буде замінено на текст (ЖГОТН+10), який після розширення ідентифікатора ^ГОТН перетвориться на вираз (80+10). Дужки дозволяють уникнути помилок в операторах, подібних наступному : Vа1=^ЕNЄТН*20;

Після обробки програми препроцесором текст набуде вигляду :

Vа1=(80+10)*20;

Значення, яке буде присвоєно змінній уаі рівне 1800. При відсутності дужок значення уаі буде рівне 280.

Vа1=80+10*20;

Приклад 2 :

#йе£іпе МАХ(х,у) ((х)>(у))?(х):(у)

В даному прикладі визначається макровизначення МАХ. Кожне входження ідентифікатора МАХ в тексті програми буде замінено на вираз ((х)>(у))?(х):(у), в якому замість формальних параметрів х та у підставляються фактичні. Наприклад, макровиклик : мах(1,2)

заміниться на вираз ((1)>(2))?(1):(2).

 

90