of 21/21
11. Preprocesiranje i stndardni ulaz/izlaz C-program se sastoji iz jedinaica za prevođenje (kompilacionih jedinica). Jedinica za prevođenje se sastoji iz izvorene datoteke i uključenih datoteka. Izvorna datoteka sadrži preprocesorske direktive i C-naredbe. U procesu prevođenja, kompilaciona jedinica se najpre podvrgava preprocesoru. Preprocesor priprema izvorni kod i prosleđuje ga prevodiocu. U toku rada, preprocesor prolazi kroz 4 faze, a rezultat njegovog rada je izmenjen izvorni 11.1. Preprocesiranje

1 1. Preprocesiranje i stndardni ulaz/izlaz

  • View
    56

  • Download
    5

Embed Size (px)

DESCRIPTION

1 1. Preprocesiranje i stndardni ulaz/izlaz. 11.1. Preprocesiranje. C-program se sastoji iz jedinaica za prevođenje (kompilacionih jedinica). Jedinica za prevođenje se sastoji iz izvorene datoteke i uključenih datoteka. Izvorna datoteka sadrži preprocesorske direktive i C-naredbe. - PowerPoint PPT Presentation

Text of 1 1. Preprocesiranje i stndardni ulaz/izlaz

  • 11. Preprocesiranje i stndardni ulaz/izlazC-program se sastoji iz jedinaica za prevoenje (kompilacionih jedinica). Jedinica za prevoenje se sastoji iz izvorene datoteke i ukljuenih datoteka. Izvorna datoteka sadri preprocesorske direktive i C-naredbe. U procesu prevoenja, kompilaciona jedinica se najpre podvrgava preprocesoru.Preprocesor priprema izvorni kod i prosleuje ga prevodiocu. U toku rada, preprocesor prolazi kroz 4 faze, a rezultat njegovog rada je izmenjen izvorni program tako da su: izbaeni komentari preprocesorske direktive su zamenjene rezultatom njihovog izvravanja 11.1. Preprocesiranje

  • Preprocesor obavlja sledee:1. Iz izvorne datoteke uitavaju se program znak po znak po potrebi neki znaci se prevode u znakove iz skupa dozvoljenih izvornih. 2. Ako se iza znaka za novi red nalazi obrnuta kosa crta, preprocesor brie oba znaka.3. Izvorna datoteka razlae se na preprocesorske tokene i na sekvence blanko-simbola (razmaka). Svaki komentar zamenjuje se jednim razmakom.4. Izvravaju se preprocesorske direktiva i realizuju pozivi makroa. Sve opisane radnje realizuju se i nad datotekama koje su umetnute pomou direktive #include.

  • U preprocesorske direktive spadaju direktive za:umetanje sadraja drugih izvornih datotekaprepoznavanje delova koda koji se prevode samo pod odreenim uslovima idefinisanje makroa identifikatora koje preprocesor zamenjuje drugim tekstom. Preprocesorska direktiva poinju znakom # i u redu se, osim nje, ne moe nai nita vie. Zavrava se prvim znakom za novi red (posle njenog poetka), Najkraa je prazna direktiva (koja je bez dejstva) i sastoji se samo iz zbaka #. Dozvoljeni su komentar i razmaci. Ako direktiva ne moe da se smesti u jedan red, na kraj prvog reda stavlja se \ (obrnuta kosa crta) i prenosi se u sledei red.

  • Primer:#define ImeMakroa Pera, \Ovo je Perin makroObrnuta kosa crta mora biti poslednji znak pre znaka za novi red.Razmaci i tabulatori mogu se nai izmeu znaka # i imena direktive. ( U prethodnom primeru ime direktive je define.)Rezultat rada preprocesora moe se videti ako se on pokrene kao poseban program, tj. ako se moe pokrenuti prevodiloac tako da se izvre samo preprocesorske direktive. Nadlje emo razmotritidirektive ukljuenja datotekamakroedirektive uslovnog prevoenja

  • 11.1.1. Direktiva umetanja (#include)Dirrektivom umetanja preprocesor umesto nje umee sadraj odreene datoteke. Postoje 2 naina da se navede datoteka koja se umee:#include #include imedatotekeU prvom sluaju ukljuuje se zaglavlje neke datoteke iz standardne biblioteke ili iz date implementacije. Na primer:#include Pomou drugog oblika mogu se umetnuti izvorne datoteke specifine za na program. Na primer: #include mojaDat.hU direktivi #include mogu se koristiti makroi (o kojima e biti reikasnije)

  • Mesto na kojem se trae datoteke iz direktive #include, zavisi od konkretne implementacije jezika C. (Datoteke izmeu uglastih zagrada obino trai u sistemskim folderima, a datoteke izmeu navodnika, obino u tekuem folderu.) Ovde ime datoteke moe sadrati i putanju do datoteke.Direktive #include mogu biti ugnjedene, tj. datoteka umetnuta pomou direktive #include, moe i sama sdrati direktive #include. Preprocesor dozvoljava najvie 15 nivoa gnjeenja. Prilikom gnjezdastog umetanja moe se desiti da se neka datoteka 2 puta umetne (datoteka stdio.h je skoro svuda prisutna). Neka u datoteci mojaOmiljena.h postoji red: #include . Ako u izvornu datoteku ukljuimo direktive:#include #include mojaOmiljena.htada bi stdio.h bila umetnuta 2 puta. Ovo se moe spreiti korienjem direktiva uslovnog prevoenja o kojim e jo biti rei.

  • 11.1.2. Makro-direktive (makroi)Makro se definiie pomou direktive #define. Ovom direktivom se dodeljuje ime proizvoljnom tekstu. Preprocesor ime makroa, gde god se pojavi u izvornom kodu posle definisanja, zameniti tim tekstom. Najee se koristi za definisanje konstanti. Na primer: #define MAX 100Po konvenciji, ime makroa pie se velikim slovima da bi se razlikovalo od imena obinih promenljivih. U makrou se ne moe definisati preprocesorska direktiva koja e potom biti realizovana (ak iako je korektno definisana).Makro moe biti definisan bez parametra ilisa parametraima.

  • 11.1.2.1 Makroi bez parametaraImaju opti oblik:#define ime_makroa tekst_zamenaOvede tekst_zamena moe biti i prazan. Primer: #define NASLOV Glavni sadrzaj #define VELICIN_BAF (4*512)Ako u programu postoje naredbe:puts (NASLOV). static char mojBafer[VELICINA_BAF];onda bi , nakon rada preprocesora, bile izvrene zamene:put ( Glavni sadrzaj );static char mojBafer[(4*512)];

  • 11.1.2.2. Makroi sa parametrimaMakroi sa parametrima lie na funkcije. Definiu se na 2 naina: #define ime_makroa( [lista_parametra] ) tekst_zamena #define ime_makroa( [lista_parametra,] ) tekst_zamenaLista_parametra je lista identfikatora razdvojenih zapetama. Tri take oznaavaju jedna ili vie dodatnih argumenata. Ne sme se pojavljivati razmak izmeu imena makroa i leve male zagrade. Prilikom zamene imena makroa tekstom, preprocesor umee i odgovarajue argumente koji zamenjuju parametre.Ako imamo #define DIST(x,y) ((x)>=(y) ? (x)-(y) : (y) (x)) d= DIST (a, b+1.6);bie izvrena sledea zamena:d= ((a)>=(b+1.6) ? (a)-(b+1.6) : (b+1.6) (a));

  • Prema standardu C99 u definiciji makroa mogu se koristiti i tri take (...). Takav makro se poziva sa promenljivim brojem argumenata.Unarni operator # (esto de naziva i operator konverzije u znakovni niz), slui za konvertovanje argumenta makroa u znakovni niz. Na primer, ako imamo: #define stampaj( par ) printf(#par = %f , par) stampaj(4*sin(1.0));poziv makro iz poslednjeg reda svodi se na:printf(4*sin(1.0) = %f , 4*sin(1.0));Kako prevodilac spaja susedne linije znkovnih nizova, bilo bi:printf(4*sin(1.0) = %f , 4*sin(1.0));Makroi se mogu ubacivati unutar drugih makroa, moe se koristiti poseban opertor ## za ubacivanje tokena (time se neemo baviti!)makro1.cpp

  • 11.1.3. Direktiva uslovnog prevoenjaPomou ove direktive moe se, pod odreenim uslovima, zadrati ili zameniti deo izvornog koda. Na taj nain program se moe prilagoditi raznim sistemima bez posebnog menjanja izvorne datoteke.

    Deo programa koji se uslovno prevodi poinje jednom od direktiva #if, #ifdef ili #ifndef, a zavrava se direktivom #endif. U njemu se moe javiti proizvoljno mnogo direktiva #elif, a najvie jedna direktiva #else.

    U ovim direktivama mogu se javiti uslovi koji su celobrojni preprocesorski izrazi. Oni su slini obinim celobrojnim C-izrazima (pojavljuju se razlike u korienju direktiva) i mogu sadrati operator defined (o kojem e biti rei).

  • Direktiva #if ima sledei opti oblik:#if izraz1 [grupa1] [#elif izraz2 [grupa2 ]][#elif izraz(n) [grupa(n) ]][#else [grupa(n+1)]] #endifPreprocesor rauna vrednosti izraza sve dok ne naie na vrednost razliite od nule (true) i tekst u odgovarajuoj grupi zadrava za dalu obradu. Ako nijedan nije true, a postoji #else, zadrava se tekst u grupi iza #else.Grupe sadre C-naredbe, a mogu sadrati i direktive.

  • 11.1.3.1. Operator definedU uslovnoj direktivi #if ili #elif moe se nai unarni operator defined, koji ima jedan od sledeih oblika:defined identifikatordefined (identifikator)Preprocesorski izraz ima vrednost 1 ako je navedeni identifikator ime makroa, tj. ako je definisan pomou direktive #define, a njegova definicija nije ponitena pomou direktive #undef. u suprotno, izraz sa operatorom defined je 0.makro21.cppmakro22.cpp

  • 11.1.3.2. Direktive #ifdef , #ifndef i #errorOve direktive slue, takoe, za proveru da li je neki makro definisan. Imaju sledeu sintaksu:#ifdef identifikator#ifndef identifikator.One se jednostavno opisuju preko defined operatora:#if defined identifikator#if !defined identifikator.Direktiva #error nalae procesoru da ispie poruku o greci, bez obzira d ali greka formalno postoji. Ima sintaksu:#error [tekst]Ako postoji opcioni tekst, on e se pojaviti u poruci o greci.makro31.cppmakro32.cpp

  • 11.1.4. Unapred definisani makroiSvaki prevodilac koji podrava ISO C mora da definie 7 sledeih makroa (njihova imena poinju i zavravaju se dvema crtama za podvlaenje):_ _ DATE _ _ tekst makroa je literal znakovnog niza koji sadri datum prevoenja u formatu Mes dd gggg, npr. Mar 23 2007_ _ FILE_ _ literal znakovnog tipa koji sadri ime tekue izvorne datoteke. _ _ LINE _ _ celobrojna konstanta ija vrednost je broj reda u tekuoj izvornoj datoteci u kojem se poziva makro _ _ LINE_ _._ _ TIME_ _ literal zakovnog niza koji sadri vreme prevoenja u formatu hh:mm:ss_ _ STDC_ _ Celobrojna konstanta je 1 ako je podran standar ISO C._ _STDC_HOSTED_ _ celobrojna koja ima vrednost 1 ako izvravanje tekueg programa zavisi od operativnog sistema, inae je 0._ _STDC_VERSION_ _ konstantta 199901 tipa long, ako je podran C99

  • 11.2. Standardni ulaz/izlazStabdardne funkcije ulaza/izlaza smetene su u standardne biblioteke od kojih se najvie koristi .Za uitavanje jednog znaka koristi se finkcija:int getchar(void)Za tampanje jednog znaka koristi se funkcija:int putchar(int)3. Za tampanje koristi se funkcija: int printf(char *format [, arg1, arg2, ...])koja prevodi interne vrednosti (zapisane u raunaru) u znakovne. Moe se opisati i ovako:int printf( [,arg1, arg2, ])

  • Funkcija printf konvertuje, formatira i tampa svoje argumente na standardni izlaz pod kontrolom format-stringa i vraa broj odtampanih znakova. Format-string sadri 2 tipa znakova:znaci koji se kopiraju na izlaz ispecifikaciju konverzije, koja vri konverziju i tampa argumenteSvaka specifikacija konverzije poinje znakom % i zavrava se znakom konverzije. Izmeu % i znaka konverzije moe postojati:znak odreuje levo poravnanje argumenatabroj odreuje minimalnu irinu polja (ako treba, proiruje se!)taka (.) razdvaja irinu polja od tanostitanost odreuje broj cifara iza dec. take ili maksimalan broj c ifara niske.h, l ili L odreujue short i long brojeve

  • Znaci konverzije mogu biti:d,iintdecimalni, celobrojninint *xpokazivakioint neoznaen oktalni celobrojnix, Xintneoznaen heksadekadni (x~a,b,..., X~A,B, ...)uintneoznaeni celobrojniccharznakovni celobrojnisstringniska-tipffloat, doublerazlomljeni ( [zn]m.ddd)e, Efloatdouble razlomljeni ([zn]m.dddExx)g, Gfloatdouble razlomljeni krai zapis od %f i %e pvoid *x(void * ) x%nita tampa %

  • Funkcijaint sprintf(char *string, char *format [, arg1, arg2, ...])ima isti efekat kao i finkcija printf, ali tampanje vri u string umesto na standardni izlaz.5. Funkcijaint scanf(char *format [,arg1, arg2, ...])iliint scanf( [, arg1, arg2, ])vri konveryiju u suprotnom smeru u odnosu na printf. Argumenti su pokazivai i pokazuju gde se memorie konvertovani podaci. Vraa se broj uspeno dodeljenih ulaznih podataka.

  • Konverzioni string, u ovom sluaju, sadri:beline koje se zanemarujuobine znake (izuzev %) koji se moraju podudarati sa odgovarajuim znakom na ulazuspecifikaciju konverzije koja se satoji od %, opcionog znaka *za ukidanje dodeljivanja, opcionog broja irine polja, opcionog h, l ili L i znaka konverzije. 6. Funkcija int sscanf(char *string, char *format [, arg1, arg2, ...])iliint sscanf(, [, arg1, arg2, ...])se primenjuje isto kao i scanf, jedino to vri uitavanje iz navedenog stringa umesto sa standardnog ulaza.

  • Konvezioni znaci: cpokaziva na chardintffloat, doublee, Efloat. doubleg, Gfloat, doubleiintnintoint oktalnisstringuneoznaen ceo dekadni, xneoznaen ceo hesadekadni []char x[]%bez dejstva