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