Sunteți pe pagina 1din 12

Functiile preprocesorului.

Definirea de constante simbolice


Definirea de macroinstruciuni
Includerea de fiiere
Compilarea condiional
Directivele (comenzile) preprocesorului:
ncep n coloana 1 prin #
se continu pe linia urmtoare cu \
pot fi incluse unele n altele
Substitutie textuala.
Definirea de constante simbolice:
#define PI 3.14159265
#define MAX 100
Substituirea textual-definire de macroinstruciuni
Sunt posibile dou alternative:
substituie textual simpl
#define NUME text
substituie cu argumente
#define NUME(arg1, arg2,,argn) text
Substitutie textuala.
Substituirea textual nu se efectueaz:
n interiorul irurilor de caractere
char mesaj[]=MAX este 100;//nu aici
n interiorul identificatorilor
int MAXIM=25; // nici aici
Dac numele apare i n textul extins, atunci
dezvoltarea se face o singur dat i nu n mod
recursiv. Astfel:
#define MAX MAX 100
nu se expandeaz dect o singur dat.
Substitutie textuala.
Un nume existent poate fi folosit pentru definirea altui
macro. Astfel pentru substituiile:
#define UNU 1
#define DOI (UNU+UNU)
In acest caz nu putem inversa ordinea directivelor.
n cazul definiiilor de macrouri cu argumente, n partea
de text se pun argumentele ntre paranteze.
Este greit definirea:
#define PATRAT(x) x*x
deoarece PATRAT(y+1) ar genera y+1*y+1, n timp
ce:
#define PATRAT(x) (x)*(x)
genereaz pentru PATRAT(y+1) textul (y+1)*(y+1)
Substitutie textuala.
Dac n textul de nlocuire un argument este
precedat de #, la expandare va apare ntre
ghilimele. Astfel pentru macrodefiniia:
#define dprint(expr) printf(#expr
=%g\n, expr)
dprint(x/y)
genereaz
printf(x/y=%g\n, x/y)
Macrodefinitii pentru lucrul cu biti.
setarea bitului n din x la 1
#define SET(x,n) ((x)|=(1<<(n)))
punerea bitului n din x pe 0
#define RESET(x,n) ((x)&=~(1<<(n)))
testul bitului n din x
#define TEST(x,n) ((x)&(1<<(n)))
Substitutie textuala.
Numrul de elemente al unui tablou se poate
calcula cu macroinstruciunea:
#define NELEM(A) sizeof(A)/sizeof(A[0])
Pentru o substituie textual care ocup mai multe
linii, la sfritul fiecrei linii care se continu se
pune \ . Astfel:
#define SWAP(A,B) {\
long t; \
(t)=(A);\
(A)=(B);\
(B)=(t);\
}
Includere de fisiere.
Directiva de includere copiaz fiierul text
menionat n textul programului, n punctul n
care apare.
Fiierul inclus se poate afla n acelai director cu
textul programului, situaie n care directiva de
includere are forma:
#include nume
Dac fiierul inclus se afl ntr-un director
special, pentru a dirija cutarea ctre acest
director se folosete directiva:
#include <nume>
Includere de fisiere.
Un fiier inclus poate include la rndul lui alte
fiiere.
Includerea de fiiere surs se folosete ca
mecanism de legare a programelor mari.
n programele C se include de obicei fiiere
antet (cu extensia .h); acestea se afl ntr-un
director cu numele INCLUDE al mediului de
programare C i conin declaraii de prototipuri
ale unor funcii de bibliotec, definiri de tipuri,
etc. Astfel fiierul antet <stdio.h> conine
prototipurile tuturor funciilor folosite n operaiile
de intrare / ieire.
Compilare conditionata.
Compilarea condiional ne permite ca dintr-un text dat
s selectm numai anumite pri care s fie compilate.
Exista directive care ne permit s efectum verificri
condiionale asupra unor expresii constante sau asupra
unor valori definite.
Un identificator devine definit dac apare ntr-o directiv
#define nume, sau poate fi fcut nedefinit prin #undef
nume.
Putem testa dac un simbol este sau nu definit i n
funcie de aceasta putem insera text (secvene de
instruciuni), care s fie compilat, conform uneia din
variantele:
Dac expresie are valoare diferit de 0 se compileaz
textul cuprins ntre #if i #endif
Compilare conditionata.
#if expresie
text
#endif
Dac simbolul NUME este definit (nedefinit), atunci se
compileaz textul cuprins ntre #if i #endif
#if defined NUME #ifdef NUME
text sau text
#endif #endif

#ifndef NUME
text
#endif
Compilare conditionata.
#if expresie #ifdef NUME
text_1 text_1
#else #else
text_2 text_2
#endif #endif
Sunt posibile i selecii multiple cu #ifdef, #elif,
#else, #endif.
Compilarea condiional se folosete pentru evitarea
includerii multiple a unui fiier.
#ifndef STDIOH
#include <stdio.h>
#define _STDIOH
#endif

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