Обмислете следния код:
СТАРТИНТЕГЛ n = 5;
PRINT ("Стойността на n е% d", n);
КРАЙ
Горният код не е валиден C код.
Но следният код е валиден:
// Пример1.° С#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.° СТази команда ще се покаже след разширяване на всички макроси.
Сега ще видим различни видове макроси:
1. Обектоподобни макроси:
Синтаксис:
#define име на макрос_макро_значение- Макросът винаги започва с #define
- macro_name е дефинирано от потребителя име на макроса
- macro_value е стойността на макроса. Може да е всичко, но един ред и тялото на макроса завършва с краищата на тази линия. Не изисква точка и запетая (;) в края. Разглежда се и пространството.
Ако макросът заема повече от един ред, можем да го направим, както следва:
#define име на макрос_макро_значение1 \macro_value2 \
macro_value3
#define MAX 200
Този макрос изглежда като обект на данни, поради което този тип макрос се извиква като обект-подобен макрос.
// Пример2.° С// # включвам
#define MAX 200
int main ()
printf ("МАКС. стойност е:% d", МАКС);
връщане 0;
В Пример2.c, МАКС е макрос. От резултата наблюдаваме това МАКС се заменя със стойността му 200.
2. Функционални макроси:
Синтаксис:
#define macro_name () macro_valueиме на макрос е дефинирано от потребителя име на макроса. Двойка скоби трябва да се постави след име на макрос. Между тях не е позволено интервал име на макрос и скоби. Също така можем да предаваме аргументи в този тип макроси.
#define add (x, y) x + yТози макрос изглежда като извикване на функция, поради което този тип макрос се нарича подобен на функция макрос.
// Пример3.° С#define add (x, y) x + y
int main ()
int a;
плувка b;
a = добавяне (4,5);
b = добавяне (2.5,3.6)
връщане 0;
В Пример3.° С, видяхме, че за разлика от функцията на C, макросът замества само кода с аргументи, без да го изчислява. Така че, можем да предадем различен тип данни, използвайки един и същ макрос.
Ако поставим интервал между името на макроса и скобите, той работи по същия начин като макрос, подобен на обект. По-долу пример C илюстрира това.
// Пример4.° С#define add (x, y) x + y
int main ()
int a;
плувка b;
a = добавяне (4,5);
b = добавяне (2.5,3.6)
В Пример4.c, видяхме, че добавянето на макрос се заменя с (x, y) x + y . Същият като обект-подобен макрос.
3. Макрос за поставяне на токени:
На език C, операторът ## се използва за поставяне на токени. Използвайки този оператор, можем да комбинираме два валидни маркера в един валиден маркер.
Пример:
#define MARGE (x, y) x ## y
int main ()
int num = MARGE (52,34);
връщане 0;
Ако се опитаме да поставим токен, който не генерира валиден маркер, C компилаторът дава грешка или предупреждение.
// Пример6.° С#define MARGE (x, y) x ## y
int main ()
int num = MARGE (52, +);
връщане 0;
В Пример 6.° С, имаме съобщение за грешка, защото след комбинация от два маркера получаваме невалиден маркер '52 + '.
4. Макрос за стринизиране:
На език C операторът # се използва за преобразуване на макро параметър в низова константа. Когато оператор # предшества с параметър на макрос, параметърът се преобразува в низов литерал. Стринизирането може да се използва за обектни и функционални макроси.
Пример:
#define STRINGIZING (x) #x
int main ()
printf (STRINGIZING (Hello World));
връщане 0;
В Пример7.° С имаме низ „Hello World”, използващ STRINGIZING макрос.
Заключение:
Тази статия научи за всички видове макроподобни Обект-подобни макроси, Функционални макроси, Макрос за поставяне на токени, Макрос за стрингиране и макрос за стринизиране на език C. Сега можем да използваме макрос в нашата програма C без никакво съмнение.