Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
шпори частина 1.docx
Скачиваний:
1
Добавлен:
01.07.2025
Размер:
248 Кб
Скачать
☆
  1. Порівняльна характеристика макросів та вбудованих функцій.

Як і функція макрос, має імя і параметри. Макрос , як і функцію викликають для його роботи. У виклику макроса задають фактичні параметри, так як типи параметрів для макроса не вказується, то процесор не виконує жодної перевірки на коректність типів параметрів.

Загальний синтаксис визначає макроси.

#define імя макросу(форм парам1, форм парам2…)

_тіло макроса

Імя макроса(форм пар1,фак пар2) Прив иклику макроса препроцесор замінює виклик макроса на тіло макроса, замінюючи при цьому форм парам на фактичний парам.

#define max(x,y) ((x)>(y)?(x):y))

#define MULT(x,y) x*y//поточ макрос

Int main() {int a=S, b=11 Cout<<MAX(a+1,b)<еndl;

//після обробки препроцесором рядок буде замінений на cout<<((a+1)>(b)?(a+1):(b))

Даний макрос max за принципом роботи схожий на функцію, яка повертає значення, адже тіло макроса є вираз. Cout<<MULT((a+1),b-2);//cout<<a+1*b-2<<endl;

Макрос розгорнувся у некоректний логічний вираз. Щоб виправити кожен аргумент макросу беремо в дужки. #define MULT(x,y) ((x)*(y))

Використання макросів призводить до збільшення коду програми, адже кожен виклик макроса препроцесором замінюється на тіло макроса.

За принципом роботи схожі на inline функції.

Вбудовані функції (inline) — це функції, чиє тіло під­ставляється в кожну точку виклику, замість того, щоб генерувати код виклику. Модифікатор inline перед вказівкою типу результа­ту в оголошенні функції загадує компілятору згенерувати копію коду функції у відповідному місці, щоб уникнути виклику цієї функції. У результаті виходить множина копій коду функцій, вставлених у програму, замість єдиної копії, якою передається керування при кожному виклику функції. Модифікатор inline не­обхідно застосовувати для невеликих і часто використовуваних функцій. Наприклад,

#include <iostream.h> inline int min (int xl, int yl) {if(xl<yl) return (xl); Else return (yl); }void main() { int x, y, z; { cout« endl « "Введіть два цілих числа "; сіn » х » у; z = mіn(х, у); cout« endl « " Мінімальним з " « х « " і" « у « " є " « z;

}

Використання inline приводить до збільшення програми,але час роботи програми зменшується, адже не витрачається додатковий час для самого виклику функції і повертається назад у точку виклику/

Компілятор може ігнорувати модифікатор inline, якщо вбудо­ваний код надто великий, компілятор згенерує звичайний виклик функції.

  1. Препроцесор. Макровизначення та макророзширення. \

Препроцесор — програма, що вико­ристовується для обробки початкового файла на нульовій фазі компіляції і замінює символічні абревіатури в програмі на від­повідні директиви. Він відшукує інші файли, необхідні для ви­конання програми, і може змінити умови компіляції. Основна мета препроцесора — закінчити остаточний текст програми на С++. Потім остаточний текст програми зазнає компіляції. Ди­рективи препроцесора — інструкції, записані в початковому тексті програми мовою C++ і призначені для виконання препроцесором мови C++. Препроцесор мови аналізує програму до компілятора і заміщує символічні абревіатури у програмі на відповідні директиви. Директиви препроцесора називають ще командними рядками, вони починаються зі спеціального знака #, що вміщується в першій позиції рядка. Директиви препроце­сора дозволяють:

Основні терміни, пов'язані з даними, що обробляються макропроцесором: макровиклик (або макрокоманда), макровизначення, макророзширення.

Макровиклик, або макрокоманда, або макрос - це оператор програми, який підлягає обробці макропроцесором (макропроцесор обробляє не всі оператори, а тільки ті, що йому адресовані).

Макровизначення - це опис того, як повинна оброблятися макрокоманда. Макровизначення може знаходитися у тому ж початковому модулі, що й макрокоманда або у бібліотеці

макровизначень.

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

+6 питання