1 / 12

Functiile p reprocesorul ui.

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.

jethro
Download Presentation

Functiile p reprocesorul ui.

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 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

  2. 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

  3. 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ă.

  4. 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)

  5. 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)

  6. 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)))

  7. 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);\ }

  8. 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>

  9. 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.

  10. 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

  11. 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

  12. 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

More Related