Макрос за примерите
Макроси в С
Сега ще разгледаме как да напишете макро и помисли макро примери. Но първо отговори на естествения въпрос: Защо имаме нужда от макроси?
Какви са макроси?
Какви са макроси? Ние говорим за макроси в В. макроси ни позволяват да се опрости програмата: вместо фразата, можете да посочите идентификатор за него. Има макроси като функции, текстът на тази "функция" се заменят на етапа на предварително третиране на негово място на повикване, което е възможно да увеличат скоростта на изпълнение на програмата, тъй като няма извикване на функция. Тези действия се извършват от Препроцесорът. Има и други предимства на работата с макроси, но има и недостатъци, както ще бъде обсъдено по-долу, когато се обръщаме към примера за създаване на макроси.
# определят в С - тази директива, който се използва при определянето на символни константи, идентификатори, макро функции. Макроси на английски макро, има два вида такива функции и други подобни обекти. В нашия урок за макроси, ще работим с тези видове макроси.
макро Sample
Един пример за макро-обект. Това определение на символични константи:
Тук определено символично константа
#define SBP "SBP-програма"
SBP - идентификатор
"SBP-програма" - низ, който ще бъде заместен за SBP.
#define SBP "SBP-програма"
Ако не посочите низ, който е заместен за идентификатора, разликата ще бъде заменен с идентификатор. например:
Вместо това, той ще бъде заменен в космическата програма.
Ако редове Първообразът не се поставя в съответствие на файла, след това се прилага обратната наклонена черта по тире. например:
Имайте предвид, че макросите, такива съоръжения не приемат параметри.
На следващо място, помислете примера на макро функция.
Пример макро функция
Да разгледаме прост пример за макро-подобни функции като макроси също се наричат макро:
# определят mCircleLength (R) (6.28318 * (с))
този макрос. И това, което е тук е определено? mCircleLength - е името на макроса. Префикс м ни казва, че това е макро, а не нормална функция. Макро mCircleLength подобни функции, тя е на параметър R.
Позволете ми да ви напомня, че макросите, такива съоръжения не приемат параметри.
Какво vychilsyaet макро mCircleLength? Той изчислява дължината на окръжността. 2Pi обиколка се умножава по радиус. 2Pi = 6,28318.
Препроцесор на мястото макро призив изпълва нашата макро, т.е. действително ФОРМАТ линия ще изглежда така:
ФОРМАТ ( "дължина \ nCircle =% .2f \ п \ п", (6,28318 * (12)));
След името на макроса в макро определението, преди първата скоба отваряне може да бъде не по пространство. Това е важно. Ако разликата е, че ние се определението на символична константа.
Помислете за макро тялото
тя е предмет на скоби. Това е от съществено значение в общия случай. параметър R в скоби. А това е важно.
Това са примери за това какво може да се случи, ако пренебрегваме скобите:
# определят mSum (параметри) параметри + 2
.
Int nVar = 10 * mSum (5);
след като тялото на макро замяна получаваме:
Int nVar = 10 * 5 ± 2;
nVar ще съхраните номера 52 вместо 70, както очаквахме.
А сега да разгледаме последиците от липсата на скоби около параметъра. Ако параметърът е сума ще бъде прехвърлена към нашия макро mCircleLength, например, 1 + 2, получаваме:
# определят mCircleLength (R) (6.28318 * R)
.
(6,28318 * 1 + 2)
Заключение: Скобките са необходими в много случаи.
Как да се използва макрос за преобразуване на обекта в низ?
Ето един пример за това макро:
# определят mIntToStr (nVar) (#nVar)
в оператора на макро низ (както понякога го наричат) ще се отрази на параметъра # nVar, резултатът ще бъде покрита NVAR цитира. код:
Оператор # помете параметър 1 + 2 кавички, превръщайки го в символни низове. Ако премахнете # в макро определението, макро mIntToStr сгънете 1 + 2. Макро Пример:
Как да използвате макро да се слеят струни?
Ленти в С могат да бъдат комбинирани с ## на оператора. Макро Пример:
Показалки в макроси
Макросите могат да се използват указатели. Макро Пример указатели:
Обърнете внимание на разположението на скоби в тялото на макроса.
Местните променливи в макроси
В макрос, можете да използвате локални променливи. Ако името на локална променлива да съвпада с името на глобално, глобалната променлива ще бъде затворен в рамките на местната макроса. Но задачата на местните ценности променливи няма да повлияе на глобалното. Макро Пример:
Макро Blocks
Макросите могат да се използват скоби, като по този начин получаване единица. Макро Пример:
Dual изчисляване Macro
Възможна че макро стойността на аргумента се изчислява два пъти. Пример за такъв макро:
Защо този резултат? Увеличаване ++ nVar уреждат два пъти. По-добре е да се избегне използването на такива решения.
Точката и запетаята в макроси
В C, в края на израза, ние поставяме точка и запетая
Необходимо ли е да се направи това в макро? Това зависи от конкретния случай. Горе в "Блоковете в макроси" има макро функция:
Ако премахнете точката и запетаята след 10 в този пример (вж. Цялата проба), компилаторът ще генерира грешка.
В други случаи, наличието на точка и запетая води до грешка. Пример (този пример включва грешка):
В този пример, макроса ще се извършва, както следва:
ако (nVar> 0)
nVar = 10;
Int nNewVar = 1;
още
nVar = 0;
Има загубил връзка между дали и другаде.
В този случай, на макроса ще се извършва, както следва:
Вторият вариант работи добре. код:
Макроси с променлив брой параметри
Макроси в C могат да имат различен брой параметри. Тези макроси се наричат variadic макроси. Типичен пример за variadic макро:
Правилата са, както следва:- променливи са отбелязани с три точки;
- Ако има са именувани параметри. Какво променливи трябва да бъде последният в списъка на параметрите
- макро променливи тялото заменят идентификатора __VA_ARGS__
Сега, един пример за макро променлив брой параметри и с именувани параметри:
Така че, ако има именувани параметри, променливите са най-новото в списък от аргументи функция. И все пак има една важна подробност в последния пример: ние не може да премине нулев брой променливи в този случай. Защо? Защото, ако не мине една променлива параметър, след последната запетая в списъка с параметри ще бъде празно. Ето един пример погрешно:
В този случай, на макроса ще се извършва в
тук след десетичната запетая няма друг избор освен, че е грешка да Xi. Заключение: най-малко един променлив параметър трябва да бъде предаден в този случай.
Изчерпване на друга макро макро
Провеждане на макро от друг макрос разгледаме един прост пример:
Това е такъв резултат.