Макрос за примерите

Макроси в С

Сега ще разгледаме как да напишете макро и помисли макро примери. Но първо отговори на естествения въпрос: Защо имаме нужда от макроси?

Какви са макроси?

Какви са макроси? Ние говорим за макроси в В. макроси ни позволяват да се опрости програмата: вместо фразата, можете да посочите идентификатор за него. Има макроси като функции, текстът на тази "функция" се заменят на етапа на предварително третиране на негово място на повикване, което е възможно да увеличат скоростта на изпълнение на програмата, тъй като няма извикване на функция. Тези действия се извършват от Препроцесорът. Има и други предимства на работата с макроси, но има и недостатъци, както ще бъде обсъдено по-долу, когато се обръщаме към примера за създаване на макроси.

# определят в С - тази директива, който се използва при определянето на символни константи, идентификатори, макро функции. Макроси на английски макро, има два вида такива функции и други подобни обекти. В нашия урок за макроси, ще работим с тези видове макроси.

макро 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. Заключение: най-малко един променлив параметър трябва да бъде предаден в този случай.

Изчерпване на друга макро макро

Провеждане на макро от друг макрос разгледаме един прост пример:

Това е такъв резултат.