Розглянемо такий код:
СТАРТЦІЛИЙ n = 5;
PRINT ("Значення n дорівнює% d", n);
КІНЕЦЬ
Наведений вище код не є дійсним кодом C.
Але дійсний наступний код:
// Приклад1.c#define START int main ()
#define END
#define INTEGER int
#define PRINT (A, B) printf (A, B)
СТАРТ
ЦІЛИЙ n = 5;
PRINT ("Значення n дорівнює% d", n);
КІНЕЦЬ
Перед компіляцією макрос START, INTEGER, PRINT і END замінено їх значенням, і код стає дійсним кодом C. Ми можемо перевірити за допомогою наступної команди:
gcc -E Приклад1.cЦя команда з’явиться після розгортання всіх макросів.
Тепер ми побачимо різні типи макросів:
1. Об'єктноподібні макроси:
Синтаксис:
#define_name_name macro_value- Макрос завжди починається з #define
- macro_name - це визначене користувачем ім'я макросу
- macro_value - значення макроса. Це може бути що завгодно, але один рядок і тіло макросу закінчуються кінцями цього рядка. Для цього не потрібна крапка з комою (;) в кінці. Також розглядається простір.
Якщо макрос займає більше одного рядка, ми можемо зробити це наступним чином:
#define_name_name macro_value1 \macro_value2 \
macro_value3
#define MAX 200
Цей макрос виглядає як об’єкт даних, тому цей тип макросу викликається як об’єктоподібний макрос.
// Приклад2.c//#включати
#define MAX 200
int main ()
printf ("МАКС. значення:% d", МАКС.);
повернути 0;
В Приклад 2.c, МАКС є макросом. З результатів ми спостерігаємо це МАКС замінюється його значенням 200.
2. Функціональні макроси:
Синтаксис:
#define macro_name () macro_valueім'я_макросу - це визначене користувачем ім'я макросу. Пару дужок потрібно поставити після ім'я_макросу. Між ними не допускається пробіл ім'я_макросу та дужки. Ми також можемо передавати аргументи в цьому типі макросів.
#define add (x, y) x + yЦей макрос виглядає як виклик функції, тому цей тип макросу називається функціональним.
// Приклад3.c#define add (x, y) x + y
int main ()
int a;
поплавок b;
a = додати (4,5);
b = додати (2.5,3.6)
повернути 0;
У прикладі 3.c, ми бачили, що на відміну від функції C, макрос замінює лише код аргументами без його обчислення. Отже, ми можемо передавати різні типи даних, використовуючи один і той же макрос.
Якщо ми ставимо пробіл між іменем макроса та дужкою, він працює так само, як макрос, схожий на об'єкт. Нижче приклад С це ілюструє.
// Приклад4.c#define add (x, y) x + y
int main ()
int a;
поплавок b;
a = додати (4,5);
b = додати (2.5,3.6)
У прикладі4.c, ми бачили, що макрос add замінюється на (x, y) x + y . Те саме, що і об’єктоподібний макрос.
3. Макрос для вставки токена:
Мовою C оператор ## використовується для вставки маркера. Використовуючи цей оператор, ми можемо об’єднати два дійсних маркери в один дійсний маркер.
Приклад:
#define MARGE (x, y) x ## y
int main ()
int num = MARGE (52,34);
повернути 0;
Якщо ми намагаємось вставити маркер, який не генерує дійсний маркер, компілятор C видає помилку або попередження.
// Приклад6.c#define MARGE (x, y) x ## y
int main ()
int num = MARGE (52, +);
повернути 0;
В Приклад6.c, ми маємо повідомлення про помилку, оскільки після поєднання двох токенів ми отримуємо недійсний маркер '52 + '.
4. Макрос для набору символів:
Мовою C оператор # використовується для перетворення параметра макросу в рядкову константу. Коли оператор # передує параметру макросу, параметр перетворюється на строковий літерал. Стрингізацію можна використовувати для об’єктних та функціональних макросів.
Приклад:
#define STRINGIZING (x) #x
int main ()
printf (STRINGIZING (Hello World));
повернути 0;
В Приклад7.c ми отримали рядок “Hello World” з використанням макросу STRINGIZING.
Висновок:
Ця стаття дізналася про всі типи макроподібних Об'єктно-подібні макроси, Функціональні макроси, Макрос для вставки токена, Макрос для розтягування та Макрос для розтягування мовою С. Тепер ми можемо використовувати макрос у нашій програмі на C. без жодних сумнівів.