Sunteți pe pagina 1din 4

Borland C++

Preprocesare

Preprocesarea
Compilarea in trepte permite si in cazul limbajului C implementarea unor facilitati de
preprocesare, indicate prin intermediul unor directive. In acest scop, directivele de preprocesare
sunt efectuate inaintea compilarii si sunt recunoscute de catre preprocesor prin prezenta
simbolului #. Ele nu se comporta ca instructiuni executabile, dar pot determina compilarea
conditionata a unor instructiuni.
Preprocesarea asigura urmatoarele:
 includerea de fisiere cu texte sursa;
 compilarea conditionata pentru asigurarea portabilitatii si testarii programelor;
 definirea de macrocomenzi.

Includerea fisierelor cu texte sursa


Pentru a include un fisier cu text sursa se foloseste directiva #include, a carei constructie
poate fi de forma
#include “specificator_fisier”
sau
#include <specificator_fisier>
unde: specificator_fisier – defineste fisierul cu text sursa aflat pe disc. In faza de
preprocesare, textul fisierului respectiv se substituie constructiei #include. In acest fel
textul fisierului indicat ia parte la compilare impreuna cu textul sursa in care a fost inclus.
In cazul sistemului de operare MS-DOS, specificatorul de fisier trebuie sa fie un nume de
fisier impreuna cu extensia lui. Extensia fisierului trebuie sa fie .h pentru fisierele antet
(fisierele header) sau .cpp pentru fisierele text sursa C++. De asemenea, specificatorul
mai poate contine si o “cale”, daca este necesar, pentru localizarea fisierului.

Diferenta dintre cele doua formate consta in modul de cautare al fisierului de inclus:
 Formatul cu paranteze unghiulare (<>) se foloseste la includerea fisierelor standard,
cum sunt cele ce contin prototipuri pentru functiile din biblioteca. Directoarele in care
se cauta aceste fisiere se definesc in prealabil folosind controlul Include Directories
din caseta de dialog Directories (vezi figura 1), care se afiseaza deschizand meniul
Options al mediului integrat de dezvoltare si selectand optiunea Directories. Ordinea
de cautare in aceste dierectoare corespunde cu ordinea in care ele au fost definite.
Daca fisierul nu este gasit in aceste directoare, atunci se afiseaza un mesaj de
eroare.

Figura 1. Caseta de dialog Directories.

1
Borland C++
Preprocesare
 Formatul cu ghilimele, determina ca operatia de cautare a fisierului sa se faca in
directorul curent sau conform “caii” daca aceasta este prezenta.
Exemple:
#include “citire.cpp> - se va include fisierul citire.cpp aflat in directorul curent.
#include “c:\\borlandc\\sursa\\scriere.cpp” – va determina includerea fisierului
scriere.cpp aflat in subdirectorul sursa a directorului borlandc din radacina discului c.
Nota: Un text inserat cu ajutorul directivei #include poate sa contina, la randul sau,
directive #include pentru alte fisiere cu text sursa.
De regula, directivele #include se scriu la inceputul fisierelor sursa, pentru ca
textele inserate sa fie valabile in tot fisierul care se compileaza.

Substituiri de succesiuni de caractere la preprocesare


Pentru a substitui succesiuni de caractere la preprocesare se foloseste directiva
#define, a carui format este:
#define nume succesiune_caractere
unde:
 nume – reprezinta un identificator, precedat si urmat de spatiu, care va fi substituit la
preprocesare;
 succesiune_caractere – reprezinta caracterele care vor inlocui nume, peste tot in
textul sursa ce urmeaza directivei, exceptand cazul cand nume apare intr-un sir de
caractere sau intr-un comentariu. suuccesiune_caractere incepe cu primul caracter
diferit de un caracter alb. succesiune_caractere poate contine si nume care au fost
definte in prealabil prin alte directive #define.
De obicei, numele substitutiei se scrie cu majuscule pentru a scoate in evidenta faptul ca
este definit printr-o directiva #define.
Directiva #define este folosita foarte des pentru definirea unor constante. Di acest
motiv, constantele definite in acest mod sunt denumite constante simbolice.
O directiva #define autorizeaza substitutia pe care o defineste din punctul in care ea
pare in fisier si pana la sfarsitul acestuia sau pana la intalnirea unei directive #undef care o
anuleaza. Directiva #undef are urmatorul format:
#undef nume
La intalnirea acestei directive, se dezactiveaza substituirea lui nume cu succesiunea de
caractere ce ia fost atasata in realabil printr-o directiva #define.
Exemple:
#define A 100 // Din acest punct A va fi inlocuit de 100
...
#define FACT 20
#define DIMMAX (A * FACT)
...
char tab[DIMMAX];
...
double mat[A][FACT]
...
Dupa preprocesare se obtin declaratiile:
char tab[(100*20)];
...
double mat[100][20];

2
Borland C++
Preprocesare
Compilare conditionata
Compilarea conditionata permite sa se aleaga dintr-un text general, in functie de anumiti
parametri, partile ce se vor compila impreuna. Acest lucru este util programelor care sunt
dependente de calculator sau de versiunea compilatorului.
Compilarea conditionata se realizeaza folosind directivele #if, #ifdef si #ifndef.
Directiva #if
Directiva #if permite selectarea textului ce se va compila din doua texte posibile si are
urmatorul format:
#if expresie
text1
[#else
text2]
#endif
unde:
 expresie – este o expresie constanta (valoarea ei poate fi evaluata de preprocesor la
intalnirea ei), care determina alternativa ce se va folosi.
 text1, text2 – sunt texte sursa care se vor compila in functie de valoarea expresiei.
Mod de actiune:
 Se evalueaza expresie;
 Daca rezultatul evaluarii expresiei este diferit de zero (adevarat), atunci se
compileaza textul sursa text1. Daca rezultatul evaluarii este zero (fals) se compileaza
textul sursa text2, daca exista clauza #else sau nu se compileaza nimic daca nu
exista aceasta clauza.
 Dupa terminarea compilarii textului sursa text1 sau text2 se continua copilarea cu
textul sursa ce urmeaza dupa #endif.
Directivele #ifdef si #ifndef
Directivele #ifdef si #ifndef se utilizeaza in mod analog si au formate identice.
Formatul directivei #ifdef este:
#ifdef nume
text1
[#else
text2]
#endif
iar al directivei #ifndef este:
#ifndef nume
text1
[#else
text2]
#endif
unde:
 nume este un identificator;
 text1, text2 – sunt texte sursa care se vor compila in functie de valoarea expresiei.
Mod de executie:
 Directiva #ifdef - text1 se preproceseaza si apoi se compileaza numai daca nume
este definit in momentul inltalnirii directivei #ifdef de catre preprocesor. In caz
contrar (nume nu este in prealabil definit) se preproceaza si apoi se compileaza

3
Borland C++
Preprocesare
text2 daca exista clauza #else (nu se preproceseaza nimic daca nu exista aceasta
clauza).
 Directiva #ifndef - text1 se preproceseaza si apoi se compileaza numai daca
nume nu este definit in momentul inltalnirii directivei #ifndef de catre preprocesor.
In caz contrar (nume este in prealabil definit) se preproceaza si apoi se compileaza
text2 daca exista clauza #else (nu se preproceseaza nimic daca nu exista aceasta
Exemplu:
Sa consideram ca un program se compune din doua fisiere f1.cpp si f2.cpp. Ambele fisiere
contin apeluri la functii ale caror prototipuri se gasesc in fisierul stdio.h. Cele doua contin
directiva
#include <stdio.h>
Cele doua fisiere se compileaza impreuna inserand directiva:
#include “f1.cpp”
in fisierul f2.cpp sau directiva
#include “f2.cpp”
in fisierul f1.cpp
Pentru ca fisierul stdio.h sa nu fie preprocesat de doua ori se pot folosi directivele de compilare
conditionata, inserand la inceputul ambelor fisiere urmatoarea secventa:
#ifndef __STDIO_H
#include <stdio.h>
#define __STDIO_H
#endif
Aceasta secventa de directive realizeaza urmatoarele:
 daca numele __STDIO_H nu este definit, atunci se include fisierul <stdio.h> si se
defineste numele __STDIO_H;
 daca numele __STDIO_H este definit se trece direct la preprocesarea textului ce
urmeaza dupa #endif.

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