Sunteți pe pagina 1din 48

Curs

Limbajul C

cap. 10. PREPOCESORUL C


Aurelia Prepelita
Conf., dr., USM

Chisinau, 2009
Continut
Capitolul 10. Prepocesorul.
 Directive preprocesor
 Directiva #include
 Directiva #define
 Macroinstructiuni
 Exemple
 Avantajele unui macro
 Pericole legate de utilizarea a macrodefinitiilor
 Exemple de macrouri
 Directiva #undef
 Compilarea conditionata
 Directiva #if
 Directivele #if, #elif, #else
 Directiva #error
 Link-uri utile
Continut
Teme suplimentare
 Operatori
 Operatori de incrementare-decrementare
 Operatori logici
 Operatori relationali
 Operatori la nivel de bit
 Alocarea memoriei
 Alocarea statica a memoriei
 Alocarea automata a memoriei
 Alocarea dinamica a memoriei
 Etapele rezolvării unei probleme cu ajutorul calculatorului
 Editare
 Compilare
 Linkeditare
 Executia
 Instalarea compilatorului borland C++
Directive preprocesor
Directive preprocesor
Directive preprocesor
Directive preprocesor
Directive preprocesor
Directiva #include
Directiva #include
Programatorul isi poate crea propriile fisiere header caz in care acesta
va fi incadrat intre " " . De exemplu:

#include "headerul_meu.h“

Numele fişierului header inclus între ghilimele, indică faptul că


headerul_meu.h este un fişier header creat de utilizator. Preprocesorul
va căuta să localizeze acest fişier în directorul curent de lucru al
utilizatorului. În cazul în care fişierul header nu se află în directorul
curent, se va indica şi calea către acesta.

Exemplu:

#include "c:\\bc\\head\\headerul_meu.h“

În acest exemplu, pentru interpretarea corectă a caracterului


backslash \, a fost necesară "dublarea" acestuia, din motive pe care le
vom prezenta în paragrafele urmatoare. 
Directiva #define
Directiva # define
Directiva define este utilizata pentru a face un program mai usor de parcurs.
Exemplu:

Directiva preprocesor incepe cu simbolul # si nu este terminata cu ';'. In mod uzual


directivele preprocesor sunt scrise la inceputul fisierului sursa.
Directivele preprocesor sunt prelucrate de catre compilator inainte de compilarea
acestuia. Toate directivele sunt procesate mai intii, iar simbolurile ce apar in cadrul
programului sunt inlocuite de valoarea lor. De abia dupa aceasta, programul este
compilat. In general, directivele preprocesor sunt scrise cu litere mari
Directiva # define
Macrosubstitutia este simpla inlocuire a unui identificator cu secventa de caractere
asociata. Astfel, daca doriti sa definiti un mesaj de eroare standart, puteti scrie ceva
de genul acesta:

#define E_MS “eroare de intrare standart \n”



printf(E_MS);
Pentru compilator instructiunea printf(E_MS) va reprezenta:

printf(“eroare de intrare standart \n”);

Daca un identificator este inchis intre ghilimele, nu se va efectua substitutia textului.


Daca grupul de caractere este mai lung decat o linie, poate fi contiuat pe urmatorul
rand plasand un backslash la sfarsitul acesteia.
Directiva # define
Directiva # define
Directiva # define
Directiva #define
#define N 10
#define M 10
#define MAX (M+N)
#define DIM(a,b) (a)*(b)

char v[N],v1[10+DIM(5+M,6)];
char v1[10*MAX];
char m[M][N];

După preprocesare secvenţa de cod va deveni:

char v[10],v1[10+(5+10)*(6)];
char v1[10*(10+10)];
char m[10][10];
Exemplu
Macroinstructiuni
Exemplu
Avantajele unui macro
Avantajele unui macro fata de o functie care sa
implementeze acelasi lucru sunt urmatoarele: In primul
rand, este evitarea apelurilor ineficiente din punct de
vedere al regiei pentru functiile simple care se reduc la una
sau doua instructiuni. In aceste cazuri este recomandabil
sa nu se mai construiasca functii care sa fie apelate, ci
instructiunile respective sa fie scrise direct in locurile unde
sunt necesare. Macrourile tratate de preprocesorul
limbajului C realizeaza generari inline a functiilor.
In al doilea rand, macrourile pot fi mai generale decat
functiile, nedepinzand de tipul parametrilor. In cazul
macroului de determinare a maximului, acesta e general si
nu depinde de tipul parametrilor, care pot fi intregi sau
reali.
Pericole legate de utilizarea a
macrodefinitiilor

Exista si anumite pericole legate de utilizarea


necorespunzatoare a macrodefinitiilor, care pot
avea efecte secundare ascunse.
De exemplu, daca se apeleaza macroul de determinare a
maximului cu urmatorii parametri:
MAX(i++, j++)
acesta va incrementa de 2 ori valoarea variabilei care e mai
mare ! pentru ca expandarea lui se face in felul urmator:
(i++) > (j++) ? (i++) : (j++)
Pericole legate de utilizarea a
macrodefinitiilor
Fie macroul de ridicare a unui numar la patrat
#define PATRAT(x) x*x
Acesta da rezultate eronate in cazul in care este apelat de
exemplu pentru x+1: PATRAT(x+1) este expandat in
x+1*x+1, ceea ce, avand in vedere precedenta operatorilor,
nu calculeaza patratul expresiei (x+1). Corect, un macro de
ridicare la patrat ar trebui scris utilizand paranteze:

#define PATRAT(x) (x)*(x)


Exemple de macrouri
Directiva #undef
Compilarea conditionata
Directivele #ifdef, #ifndef, #if, #endif, #else si #elif permit
eliminarea in timpul compilarii unor parti din codul programului
daca o anumita conditie nu este indeplinita.
Directiva #ifdef

Exemplu:
Directiva #ifndef
Directiva #if
Directiva #if

#if expr
text1
#else
text2
#endif

In interiorul unei directive #if, expresia defined(nume)


are valoarea 1 daca nume a fost deja definit de o
directiva define, sau zero in caz contrar.
Directivele #if, #elif, #else
Directiva #if

Se poate observa
faptul ca directivele
inlantuite #if, #elsif
si #else se
incheie cu #endif.
Directiva #error
Link-uri utile
 http://www.scribd.com/doc/22023490/PROGRAMAREA-CALCULATO
ARELOR-IN-LIMBAJUL-C
Teme suplimentare
 Operatori
 Operatori de incrementare-decrementare
 Operatori logici
 Operatori relationali
 Operatori la nivel de bit
 Alocarea memoriei
 Alocarea statica a memoriei
 Alocarea automata a memoriei
 Alocarea dinamica a memoriei
 Etapele rezolvării unei probleme cu ajutorul calculatorului
 Editare
 Compilare
 Linkeditare
 Executia
 Instalarea compilatorului borland C++
Operatori de incrementare-
decrementare
Operatori logici
Operatori relationali
Operatori la nivel de bit
Alocarea statica/automata a
memoriei
Una din cele mai importante funcţii ale unui limbaj de programare
este ca acesta să furnizeze metode de management a memoriei şi
al obiectelor stocate în memorie. C furnizează trei metode
distincte de alocare a memoriei pentru obiecte:
Alocarea statică a memoriei: adresele şi dimensiunile
obiectelor ce fac uz de alocarea statică a memoriei sunt fixate în
momentul compilării şi pot fi plasate într-o zonă de dimensiune
fixă ce corespunde unei secţiuni din cadrul fişierului linkedidat
final. Acest tip de alocare a memoriei se numeşte statică
deoarece locaţia şi dimensiunea lor nu variază pe durata de
execuţie a programului.
Alocarea automată a memoriei: obiectele temporare
(variabilele locale declarate în cadrul unui bloc de cod) sunt
stocate în memorie, iar spaţiul alocat este automat eiberat şi
reutilizat după ce s-a părăsit blocul în care acestea au fost
declarate.
Alocarea dinamica a memoriei
Alocarea dinamică a memoriei: blocuri de memorie de orice dimensiune pot
fi alocate într-o zonă de memorie numită heap prin intermediul funcţiilor
malloc(), calloc() şi realloc(). Aceste blocuri de memorie pot fi reutilizate
după ce zona de memorie a fost eliberată prin apelul funcţiei free().
Nu toate variabilele sunt automat alocate. Următoarele tipuri de variabilă
sunt alocate static:
toate variabilele globale, indiferent dacă au fost sau nu declarate ca statice;
variabilele locale declarate explicit ca fiind statice.
Variabilele alocate static au alocată locaţia lor de memorie şi iniţializată
înainte ca funcţia main să fie executată şi nu sunt dealocate până când se
termină execuţia funcţiei main. Variabilele alocate static nu sunt reiniţializate
la fiecare apel al funcţiei în cadrul cărora au fost declarate. O variabilă
alocată static are avantajul să îşi păstreze valoarea chiar dacă funcţiile care
accesează acea valoare nu mai sunt active.
Alocarea memoriei

Acolo unde este posibil, alocarea automată sau statică este


preferată deoarece alocarea memoriei este coordonată de
compilator, nemaifiind nevoie ca programatorul să aloce iar
apoi să elibereze memoria - operaţie ce adesea generează
erori.
Totuşi, multe structuri de date sunt variabile în
dimensini şi deoarece alocarea automată şi cea statică
trebuie să fie de dimensiune fixă în momentul compilării,
sunt multe situaţii în care alocarea dinamică trebuie folosită.
Un exemplu ar fi tablourile de dimensiuni variabile.
Etapele rezolvării unei probleme cu
ajutorul calculatorului
Etapele de implementare. După analiza problemei şi
stabilirea algoritmului, acesta trebuie tradus
(implementat) într-un limbaj de programare.
Scrierea (editarea) programului sursă.
Programele sursă sunt fişiere text care conţin
instrucţiuni (cu sintactica şi semantica proprii
limbajului utilizat). Programul (fişierul) sursă este
creat cu ajutorul unui editor de texte şi va fi
salvat pe disc (programele sursă C primesc, de
obicei, extensia .c, iar cele C++, extensia .cpp).
Pentru a putea fi executat, programul sursă trebuie
compilat şi linkeditat.
Etapele rezolvării unei probleme cu
ajutorul calculatorului
Compilarea
Procesul de compilare este realizat cu ajutorul compilatorului,
care translatează codul sursă în cod obiect (cod maşină),
pentru ca programul să poată fi înţeles de calculator. În
cazul limbajului C, în prima fază a compilării este invocat
preprocesorul. Acesta recunoaşte şi analizează mai întâi o
serie de instrucţiuni speciale, numite directive procesor.
Verifică apoi codul sursă pentru a constata dacă acesta
respectă sintaxa şi semantica limbajului. Dacă există erori,
acestea sunt semnalate utilizatorului. Utilizatorul trebuie să
corecteze erorile (modificând programul sursă). Abia apoi
codul sursă este translatat în cod de asamblare, iar în final,
în cod maşină, binar, propriu calculatorului. Acest cod binar
este numit cod obiect şi de obicei este memorat într-un alt
fişier, numit fişier obiect. Fişierul obiect va avea, de obicei,
acelaşi nume cu fişierul sursă şi extensia .obj.
Etapele rezolvării unei probleme cu
ajutorul calculatorului

Linkeditarea
Dupa ce programul sursă a fost translatat în
program obiect, el este supus operaţiei de
linkeditare. Scopul fazei de linkeditare este acela
de a obţine o formă finală a programului, în
vederea execuţiei acestuia. Linkeditorul “leagă”
modulele obiect, rezolvă referinţele către funcţiile
externe şi rutinele din biblioteci şi produce cod
executabil, memorat într-un alt fisier, numit fişier
executabil (acelaşi nume, extensia .exe)
Etapele rezolvării unei probleme cu
ajutorul calculatorului

Execuţia
Lansarea în execuţie constă în
încărcarea programului executabil în
memorie şi startarea execuţiei sale.
Etapele rezolvării unei probleme cu
ajutorul calculatorului

Observaţii:
Mediile de programare integrate (BORLANDC, TURBOC)
înglobează editorul, compilatorul, linkeditorul şi
depanatorul (utilizat în situaţiile în care apar erori la
execuţie);
Dacă nu se utilizează un mediu integrat, programatorul va
apela în mod explicit (în linie de comandă) un editor de
texte, compilatorul, linkeditorul. Lansarea în execuţie se
va face tot din linie de comandă.
Extensiile specificate pentru fişierele sursă, obiect şi
executabile sunt CPP (sau C), OBJ respectiv EXE.
Instalarea borland C++

Instalarea borland C/C++:

http://info-it.talentirosit.com/2009/10/23/instalarea-borlan
d-c-3-1-pe-windows-xp-si-windows-vista-sau-7/

Compilatorul poate fi descarcat la adresa:

http://info-it.talentirosit.com/download/

S-ar putea să vă placă și