Un fisier sursa are extensia .c
.
Intr-un fisier C pot aparea:
-
includeri
-
macrocomenzi
-
definitii tipuri de date
-
definitii de constante globale
-
definitii de variabile globale
-
antete / definitii de functii
La intalnirea #
compilatorul intelege ca urmeaza informatii cu privire la compilare. Dupa #
poate aparea cuvantului include
urmat de numele unui fisier dat intre <>
sau ""
. La compilare, fisierul respectiv este cautat pe drive si ceea ce gaseste in acel fisier va fi folosit la compilarea fisierului curent.
<>
- cautat in folderul de fisiere antet ale compilatorului (mediului de programare). Acest folder pe disk are denumirea de include
. Aici se gasesc, de regula, fisierele antet standard ale limbajului C.
stdio.h
, conio.h
, stdi.h
, string.h
""
- cautat atat in folderul include cat si in caile curente de cautare. De regula, includerea presupune un fisier antet (cu extensia .h
- header); putem include si alte fisiere cu extensia .c
.
Intr-un fisier antet pot aparea aceleasi elemente enumerate anterior, insa, intr-un fisier antet nu se scriu definitii de functii, ci numai antete de functii.
-
pentru parametri putem da / omite denumiri
-
antetul unei functii se incheie cu
;
ex.:
int test();
int max (int, int);
int min (int a, int b);
Rolul fisierelor antet:
-
la compilarea unui proiect, fiecare fisier din acel proiect este compilat separat; in momentul in care se intalneste un apel de functie intr-un fisier
.c
si acea functie nu este implementat in acel fisier se cauta antetul functiei apelate intr-unul dintre fisierele.h
. -
daca apelul se potriveste cu antetul gasit, se trece mai departe cu compilarea acelui fisier.
-
in C, semnatura unei functii este data de numele acele functii; prin semnatura functiei intelegem caracteristicile dupa care o functie este cautata la compilare.
-
din cauza ca in C, semnatura unei functii este data de numele ei, nu putem avea mai multe functii in acelasi proiect cu acelasi nume si cu parametri diferiti, asa cum este acceptat in C++, unde semnatura este data de nume, nr de parametri si tipurile de date ale parametrilor.
-
dupa ce toate fisierele programului au fost compilate cu succes se trece la etapa de link-edit-are, unde se fac legaturile dintre codurile obiect, rezultate in urma compilarii fisierelor sursa. in exemplul nostru, apelul
max(1,2)
se va transmite unei functii implementate cu numelemax
si cu 2 parametriint
. dintr-un alt fisier sursa compilat sau dintr-un fisier care deja exista compilat. -
fisierele C compilate sunt fisiere cu extensia
.obj
,.lib
sau fisiere externe:file.obj
se obtine in urma compilarii unui fisier C;file.lib
sunt biblioteci statice care contin o multitudie de functii compilate; fisierelefile.obj
sifile.lib
sunt conectate de catre link-editor pentru a finaliza crearea fisierului executabil.exe
. -
exista posibilitatea ca unele functii sa fie implementate in biblioteci externe, apelurile acestor functii nefiind
include
in fisierul executabil, apelurile acestor functii identificandu-se atunci cand programul se lanseaza in executie; fisierele externe in care se afla astfel de functii poarta numele de biblioteci dinamice; sub Win OS, acestea au extensia.dll
.
Intr-un fisier sursa C cu extensia .h
/.c
putem declara variabile in exteriorul functiilor, devenind astfel variabile globale cunoscute in intreg proiectul. O variabila globala este cunoscuta din locul declararii in jos. Nu este recomandat a se folosi variabile globale.
ex.
tipdate var;
tipdate var = val;
In momentul intalnirii unei declaratii de var globala, respectiva var intra in stiva de executie si la iesirea blocului din care este declarata, var paraseste stiva de executie. De asemenea, putem avea si constate globale (nerecomandat). La compilare, orice referire la const in program este inlocuita cu valoarea constantei; o constanta se defineste:
const tipdate numeCst = val;
abbr. MCA
MCA poate fi considerata o generalizare a conceptului de constanta, in sensul ca referirea la o macrocomanda este inlocuita la compilare cu corpul macrocomenzii; MCA se expandeaza la compilare intr-o secventa de cod descrisa in corpul MCA. MCA reprezinta un suport foarte puternic pt programarea generica in C.
Pornind de la tipurile de date existente putem construi noi tipuri de date mai complexe folosind cuvantul rezervat typedef
.
ex.
typedef tipdate denumire;
typedef int intreg;
intreg n = 10;
int x = 1;
typedef struct
{
float x, y;
}punct2D;
Un tip de date structura format dintr-o pereche se numere reale cu denumirea punct2D
, acesta fiind un tip de date mai complex definit pe baza tipului elementar float
.
punct2D p;