120 likes | 228 Views
Functiile p reprocesorul ui. 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.
E N D
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