Sunteți pe pagina 1din 12

Functiile preprocesorului.

• Definirea de constante simbolice


• Definirea de macroinstrucţiuni
• Includerea de fişiere
• Compilarea condiţională
Directivele (comenzile) preprocesorului:
• încep în coloana 1 prin ‘#’
• se continuă pe linia următoare cu ‘\’
• pot fi incluse unele în altele
Substitutie textuala.
Definirea de constante simbolice:
#define PI 3.14159265
#define MAX 100
Substituirea textuală-definire de macroinstrucţiuni
Sunt posibile două alternative:
• substituţie textuală simplă
#define NUME text
• substituţie 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ă decât o singură dată.
Substitutie textuala.
Un nume existent poate fi folosit pentru definirea altui
macro. Astfel pentru substituţiile:
#define UNU 1
#define DOI (UNU+UNU)
In acest caz nu putem inversa ordinea directivelor.
În cazul definiţiilor de macrouri cu argumente, în partea
de text se pun argumentele între paranteze.
Este greşită 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 macrodefiniţia:
#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.
• Numărul de elemente al unui tablou se poate
calcula cu macroinstrucţiunea:
#define NELEM(A) sizeof(A)/sizeof(A[0])
• Pentru o substituţie textuală care ocupă mai multe
linii, la sfârşitul fiecărei 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ă fişierul text
menţionat în textul programului, în punctul în
care apare.
• Fişierul inclus se poate afla în acelaşi director cu
textul programului, situaţie în care directiva de
includere are forma:
#include “nume”
• Dacă fişierul inclus se află într-un director
special, pentru a dirija căutarea către acest
director se foloseşte directiva:
#include <nume>
Includere de fisiere.
• Un fişier inclus poate include la rândul lui alte
fişiere.
• Includerea de fişiere sursă se foloseşte ca
mecanism de legare a programelor mari.
• În programele C se include de obicei fişiere
antet (cu extensia .h); acestea se află într-un
director cu numele INCLUDE al mediului de
programare C şi conţin declaraţii de prototipuri
ale unor funcţii de bibliotecă, definiri de tipuri,
etc. Astfel fişierul antet <stdio.h> conţine
prototipurile tuturor funcţiilor folosite în operaţiile
de intrare / ieşire.
Compilare conditionata.
• Compilarea condiţională ne permite ca dintr-un text dat
să selectăm numai anumite părţi care să fie compilate.
• Exista directive care ne permit să efectuăm verificări
condiţionale asupra unor expresii constante sau asupra
unor valori definite.
• Un identificator devine definit dacă apare într-o directivă
#define nume, sau poate fi făcut nedefinit prin #undef
nume.
• Putem testa dacă un simbol este sau nu definit şi în
funcţie de aceasta putem insera text (secvenţe de
instrucţiuni), 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 selecţii multiple cu #ifdef, #elif,
#else, #endif.
Compilarea condiţională se foloseşte pentru evitarea
includerii multiple a unui fişier.
#ifndef STDIOH
#include <stdio.h>
#define _STDIOH
#endif

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