Macros asupra exemplelor

Macrocomenzi în C

Acum ne uităm la cum să scrie un macro și ia în considerare exemple macro. Dar mai întâi să răspundă la întrebarea naturală: De ce avem nevoie de macro-uri?

Care sunt macro-uri?

Care sunt macro-uri? Vorbim despre macro-uri în C. Macrocomenzi ne permit simplificarea programului: în loc de fraza, puteți specifica un identificator pentru el. Există macro-uri cum ar fi funcții, textul acestei „funcție“ este substituită în etapa de pre-tratare în locul său un apel, care crește potențial viteza de execuție a programului, pentru că nu există nici un apel de funcție. Aceste acțiuni sunt efectuate de către preprocesor. Există și alte avantaje de a lucra cu macro-uri, dar există și dezavantaje, după cum se va discuta mai jos, atunci când ne întoarcem la exemplul de a crea macro-uri.

#define în C - această directivă, care este utilizată în determinarea constantelor simbolice, identificatorii, funcțiile macro. Macrocomenzi în macro limba engleză, există două tipuri de astfel de funcții și obiecte similare. În programul de instruire pe macro-uri, vom lucra cu aceste tipuri de macro-uri.

macro Exemplu

Un exemplu pentru un obiect macro. Această definiție a constantelor simbolice:

Aici sunt definite constante simbolice

#define SBP "SBP-Programul"

SBP - un identificator
„SBP-Program“ - un șir de caractere, care va fi înlocuit de SBP.

#define SBP "SBP-Programul"

Dacă nu specificați un șir de caractere care este substituit pentru identificatorul, decalajul va fi înlocuit cu identificatorul. exemplu:

În schimb, acesta va fi înlocuit în programul spațial.

În cazul în care-rând permutare nu este plasat în linie a fișierului, apoi aplicați un backslash ca cratimă. exemplu:

Rețineți că macro-uri, astfel de instalații nu acceptă parametri.

În continuare, ia în considerare exemplul unei funcții macro.

Funcția macro EXEMPLU

Luați în considerare exemplul simplu al unei caracteristici macro-ca astfel de macro-uri sunt, de asemenea, numite macro:

#define mCircleLength (r) (6.28318 * (r))

acest macro. Și ce este definit aici? mCircleLength - este numele macro. Prefixul m ne spune că acest lucru este un macro, nu o funcție normală. Macro mCircleLength funcții similare, este nevoie de parametrul r.

Permiteți-mi să vă reamintesc că macro-uri, astfel de instalații nu acceptă parametri.

Ce vychilsyaet mCircleLength macro? Se calculează lungimea circumferinței. 2Pi circumferință este înmulțită cu raza. 2pi = 6.28318.

Preprocesor în loc de apel macro umple linia noastră macro, adică de fapt printf ar arata astfel:

printf ( "lungime \ nCircle =% .2f \ n \ n", (6.28318 * (12)));

După numele macro în definiția macro, înainte de prima deschidere consola poate fi nici un spațiu. Acest lucru este important. În cazul în care diferența este, vom obține definiția unei constante simbolice.

Luați în considerare corpul macro

este acoperit de paranteze. Este esențial în cazul general. parametru r între paranteze. Și acest lucru este important.

Iată câteva exemple de ceea ce se poate întâmpla dacă am ignora paranteze:

#define mSum (param) param + 2
.
int nVar = 10 * mSum (5);

după ce corpul de substituție macro obținem:

int nVar = 10 * 5 + 2;

nVar va stoca numărul 52 în loc de 70, așa cum ne-am așteptat.

Acum, ia în considerare consecințele lipsei de paranteze în jurul parametrului. Dacă parametrul este o sumă va fi transferată către mCircleLength nostru macro, de exemplu, 1 + 2, obținem:

#define mCircleLength (r) (6.28318 * r)
.
(6.28318 * 1 + 2)

Concluzie: Parantezele sunt necesare în multe cazuri.

Cum să utilizați un macro pentru a converti obiectul într-un șir de caractere?

Aici este un exemplu al acestui macro:

#define mIntToStr (nVar) (#nVar)

în operatorul șir macro (cum este numit uneori) va afecta parametrul # nVar, rezultatul va fi acoperit NVAR citate. cod:

Operator # măturat parametru 1 + 2 citate, transformându-l într-un șir literal. Dacă îndepărtați # în definiția macro, mIntToStr macro plia 1 + 2. Exemplu Macro:

Cum de a folosi un macro pentru a înlănțui siruri de caractere?

Siruri de caractere în C pot fi combinate cu ## de operator. Exemplu Macro:

Pointeri în Macrocomenzi

Macrocomenzile pot fi indicii folosite. Exemplu indicii macro:

Să acorde o atenție la aranjarea paranteze în corpul macro.

Variabilele locale în macro-uri

În macro, puteți utiliza variabile locale. Dacă numele unei variabile locale coincide cu numele global, variabila globală va fi închisă în cadrul macro locale. Dar atribuirea valorilor variabile locale nu va afecta la nivel mondial. Exemplu Macro:

Blocuri macro

Macrocomenzile pot fi folosite acolade, astfel unitatea de primire. Exemplu Macro:

Macro dublă calcul

Posibil că valoarea argument macro va fi calculat de două ori. Un exemplu de astfel de macro:

De ce acest rezultat? Incrementați ++ nVar stabilit de două ori. Este mai bine să se evite utilizarea unor astfel de soluții.

Semicoloana în Macrocomenzi

În C, la sfârșitul expresiei, am pus o virgulă

Este necesar să se facă acest lucru într-un macro? Depinde de fiecare caz în parte. Mai sus sub „Blocurile din macro-uri“ are funcția de macro:

Dacă eliminați după virgulă 10 în acest exemplu (a se vedea. Întregul eșantion), compilatorul va genera o eroare.

În alte cazuri, prezența unui punct și virgulă duce la eroare. Exemplu (acest exemplu include o eroare):

În acest exemplu, macro se va desfășura după cum urmează:

if (nVar> 0)
nVar = 10;
int nNewVar = 1;
altfel
nVar = 0;

Au pierdut legătura între dacă și altceva.

În acest caz, macro se va desfășura după cum urmează:

Această din urmă opțiune funcționează bine. cod:

Macrocomenzi cu un număr variabil de parametri

Macros în C poate avea un număr variabil de parametri. Aceste macro-uri sunt numite macro-uri variadic. Un exemplu tipic de macro variadic:

Regulile sunt după cum urmează:
  • variabile sunt notate cu trei puncte;
  • Dacă nu sunt numite parametri. Ce variabile ar trebui să fie ultimul în lista de parametri
  • variabile ale corpului macro înlocuiți identificatorul __VA_ARGS__

Acum, un exemplu de un număr variabil de parametri macro și cu parametrii numiți:

Deci, dacă există parametrii numiți, variabilele sunt cele mai recente dintr-o listă a funcției argumente. Cu toate acestea există un detaliu important în ultimul exemplu: nu putem trece un număr nul de variabile în acest caz. De ce? Pentru că, dacă nu treci un singur parametru variabil, după ultima virgulă în lista de parametri va fi goală. Aici este un exemplu eronată:

În acest caz, macro se va desfășura în

aici după punctul zecimal nu are nici o opțiune, dar este o greșeală să Xi. Concluzie: cel puțin un parametru variabil trebuie să fie transmis în acest caz.

Rularea de un alt macro macro

Rularea un macro dintr-un alt aspect macro la un exemplu simplu:

Asta-i un astfel de rezultat.