Constante. Macrocomenzi.(Curs 3)

În C o constantă obişnuită se poate defini folosind cuvântul rezervat const astfel:
const tip_date c=expresie_constanta;
Dacă lipseşte tipul de date de la definirea unor constante, se consideră implicit tipul int.
Iată şi câteva exemple:
const int x=1+4;
const a=1,b=2*2; /* tot constante intregi ! */
const double pi=3.14159
Macrocomanda reprezintă o generalizare a conceptului de constantă, în sensul că putem
defini expresii constante, care se înlocuiesc în codul executabil în momentul compilării.
Definirea unei macrocomenzi începe cu semnul # (diez) urmat de cuvântul define.
Dăm câteva exemple de macrocomenzi:
# define N 100
# define PI 3.14159
# define suma(x,y) x+y
# define alipire(a,b) (a##b)
Primele două macrocomenzi definesc constante obişnuite, N este o constantă de tip
întreg, iar PI este una de tip real.
Ultimele două macrocomenzi de mai sus definesc câte o expresie constantă. Într-un
program care cunoaşte a treia macrocomandă, un apel de forma suma(1.7, a) se va înlocui la
compilare cu 1.7+a. Înlocuirea se face în fiecare loc în care este apelată macrocomanda. De
aceea, macrocomanda poate fi considerată o generalizare a conceptului de constantă, deşi apelul
ei seamănă cu cel al unei funcţii.
Comportamentul macrocomenzilor poate conduce la erori de programare pentru cei care
nu cunosc modul lor de funcţionare. De exemplu, valoarea expresiei suma(1,2)*5 este 11 şi nu
15, deoarece înlocuirea directă a apelului suma(1,2) la compilare cu 1+2 conduce la expresia
1+2*5, care are evident valoarea 11 şi nu la expresia (1+2)*5 cu valoarea 15.
În exemplul de mai sus la ultima macrocomandă s-a folosit operatorul ## care alipeşte
(concatenează) doi tokeni. Astfel, un apel de forma alipire(x,yz) se înlocuieşte cu xyz, care poate
fi o variabilă, numele unei funcţii etc.
Este important de observat că datorită comportamentului diferit de cel al funcţiilor,
macrocomenzile sunt contraindicate pentru a fi folosite prea des într-un program, deoarece
fiecare apel de macrocomandă se înlocuieşte în memorie cu corpul macrocomenzii, ceea ce
7
conduce la mărirea codului executabil. În concluzie, când se lucrează cu macrocomenzi codul C
sau C++ se poate reduce ca lungime, dar codul în formă compilată poate creşte.
Frumuseţea macrocomenzilor constă în faptul că nu lucrează cu tipuri de date prestabilite.
Astfel, în exemplul de mai sus macrocomanda suma va putea fi folosită pentru orice tip de date,
atâta timp cât între x si y se poate aplica operatorul +. Din cauză că la definire nu se specifică
tipul de date al parametrilor, macrocomenzile pot fi văzute ca un rudiment de programare
generică oferit de limbajul C.
În limbajul C++ pot fi scrise funcţii şi clase şablon pentru care unul sau mai multe tipuri
de date sunt nespecificate, identificarea acestor tipuri făcându-se în momentul compilării
programului. Şabloanele reprezintă un suposuport pentru programare generică în adevăratul sens al
cuvântului. Asupra şabloanelor vom reveni.

0 comentarii:

Trimiteți un comentariu