Узмите у обзир следећи код:
ПОЧЕТАКИНТЕГЕР н = 5;
ПРИНТ („Вредност н је% д“, н);
КРАЈ
Горњи код није важећи Ц.
Али следећи код је важећи:
// Пример1.ц#дефине СТАРТ инт маин ()
#дефине ЕНД
#дефине ИНТЕГЕР инт
#дефине ПРИНТ (А, Б) принтф (А, Б)
ПОЧЕТАК
ИНТЕГЕР н = 5;
ПРИНТ („Вредност н је% д“, н);
КРАЈ
Пре компилације, макро СТАРТ, ИНТЕГЕР, ПРИНТ и ЕНД су замењени њиховом вредношћу, а код постаје важећи Ц код. Можемо проверити помоћу следеће команде:
гцц -Е Пример1.цОва наредба ће се приказати након проширења свих макронаредби.
Сада ћемо видети различите врсте макронаредби:
1. Макрони налик објектима:
Синтакса:
#дефине мацро_наме мацро_валуе- Макро увек почиње са #дефине
- мацро_наме је корисничко име које дефинише макро
- мацро_валуе је вредност макроа. То може бити било шта, али једна линија и тело макроа завршавају се крајевима те линије. Не захтева тачку и зарез (;) на крају. Разматра се и простор.
Ако макро заузима више линија, можемо то учинити на следећи начин:
#дефине мацро_наме мацро_валуе1 \мацро_валуе2 \
мацро_валуе3
#дефине МАКС 200
Овај макро изгледа као објект података због чега се ова врста макроназива назива макро налик објекту.
// Пример2.ц// # укључује
#дефине МАКС 200
инт маин ()
принтф ("МАКС вредност је:% д", МАКС);
ретурн 0;
У Екапмле2.ц, МАКС је макро. Из резултата то примећујемо МАКС замењује се његовом вредношћу 200.
2. Макрони налик функцијама:
Синтакса:
#дефине мацро_наме () мацро_валуемацро_наме је корисничко име које дефинише макро. Пар заграда мора се ставити иза мацро_наме. Није дозвољен размак између мацро_наме и заграде. Такође можемо проследити аргументе у овој врсти макронаредби.
#дефине адд (к, и) к + иОвај макро изгледа као позив функције, зато се ова врста макроа назива макро налик функцији.
// Пример3.ц#дефине адд (к, и) к + и
инт маин ()
инт а;
флоат б;
а = додај (4,5);
б = додај (2.5,3.6)
ретурн 0;
У Примеру3.ц, видели смо да за разлику од функције Ц, макро замењује само код аргументима без израчунавања. Дакле, можемо проследити различите типове података користећи исти макро.
Ако ставимо размак између имена макронаредбе и заграде, он функционише исто као макро налик објекту. Испод пример Ц илустрира ово.
// Пример4.ц#дефине адд (к, и) к + и
инт маин ()
инт а;
флоат б;
а = додај (4,5);
б = додај (2.5,3.6)
У примеру4.ц, видели смо да је макро додатак замењен са (к, и) к + и . Исто као објектни макро.
3. Макро за лепљење токена:
На језику Ц, оператор ## се користи за лепљење токена. Коришћењем овог оператора можемо комбиновати два важећа токена у један важећи жетон.
Пример:
#дефине МАРГЕ (к, и) к ## и
инт маин ()
инт нум = МАРГЕ (52,34);
ретурн 0;
Ако покушамо лепити токен који не генерише важећи токен, Ц компајлер даје грешку или упозорење.
// Пример6.ц#дефине МАРГЕ (к, и) к ## и
инт маин ()
инт нум = МАРГЕ (52, +);
ретурн 0;
У Пример6.ц, имамо поруку о грешци јер након комбинације два токена добијамо неважећи токен '52 + '.
4. Макро за низање:
У језику Ц, оператор # користи се за претварање параметра макронаредбе у константу низа. Када оператор # претходи параметру макронаредбе, параметар се претвара у литерал низа. Стрингизирање се може користити за макроне налик објектима и функцијама.
Пример:
#дефине СТРИНГИЗИНГ (к) #к
инт маин ()
принтф (СТРИНГИЗИНГ (Хелло Ворлд));
ретурн 0;
У Пример7.ц добили смо низ „Хелло Ворлд“ користећи СТРИНГИЗИНГ мацро.
Закључак:
Овај чланак је научио о свим врстама макро-сличних Макрои налик објектима, Макрони налик функцији, Макро за лепљење токена, Макро за низање и Макро за низање на језику Ц. Сада без икакве сумње можемо користити макро у нашем Ц програму.