Documente Academic
Documente Profesional
Documente Cultură
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.
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.
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.
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.