Prezentace se nahrává, počkejte prosím

Prezentace se nahrává, počkejte prosím

PROGRAMOVÁNÍ V C JAZYKU - SEMINÁŘ Ing. Michal

Podobné prezentace


Prezentace na téma: "PROGRAMOVÁNÍ V C JAZYKU - SEMINÁŘ Ing. Michal"— Transkript prezentace:

1 PROGRAMOVÁNÍ V C JAZYKU - SEMINÁŘ Ing. Michal

2 Programování v C jazyku – SEMINÁŘ Ing. Michal Preprocesor jazyka C 7

3 Agenda  Základní činnosti preprocesoru  Makra bez parametrů (symbolické konstanty)  Makra s parametry  Vkládání souborů  Oddělený překlad souborů  Podmíněný překlad

4 Preprocesor jazyka C

5 Základní činnost preprocesoru  Zpracování zdrojového textu před použitím překladače  Nekontroluje syntaktickou správnost programu  Provádí pouze záměnu textu (např. identifikátorů konstant) za odpovídající číselné hodnoty (zpracování maker)  Vypustí ze zdrojového textu všechny komentáře  Připravuje podmíněný překlad

6 Makra bez parametrů  Symbolické konstanty  Příkaz #define  Pravidla pro psaní konstant:  Většinou se zapisují velkými písmeny  Mezi jménem a hodnotou alespoň jedna mezera  Za hodnotu je vhodné umístit komentář  Nové konstanty mohou využívat již dříve definovaných konstant  Pokud je konstanta delší než řádka, uvádíme na konci znak /

7 Makra bez parametrů #define PI 3.14 #define DVE_PI (2*PI) #define MOD % #define JMENO ″Michal″ #define ERROR {printf(″Chyba″);}

8 Makra bez parametrů  Poznámky:  Za hodnotami není středník  Mezi jménem konstanty a hodnotou se nepíše znak „=“  Konstanta platí od místa definice do konce souboru

9 Makra bez parametrů  Ukončení platnosti makra – příkaz #undef  Příklad: #define POCET 20 #undef POCET #define POCET 30

10 Makra bez parametrů #include #define PI 3.14 int main() { double r = 6.5; double v = 2.1; printf(″Objem valce je %f!″,PI*r*r*v); return 0; }

11 Makra bez parametrů #include #define POSUN (′a′-′A′) #define KONEC_R ′\n′ int main() { int c; while ((c = getchar()) != KONEC_R) { if (c >= ′a′ && c <= ′z′) putchar(c-POSUN); else putchar(c); } return 0; }

12 Makra s parametry  Alternativa ke kratším funkcím  Nevýhoda použití funkce  Při použití funkce menší efektivita programu  Nevýhoda použití makra  Při použití makra vznikne delší (ale rychlejší) program  Na rozdíl od funkcí preprocesor nahradí jméno makra v programu konkrétním textem

13 Makra s parametry  Obecná syntaxe: #define jmeno_makra(arg1,…,argN) hodnota_makra  Příklad použití: #define je_velke(c) ((c) >= ′A′ && (c) <= ′Z′) ch = je_velke(ch) ? ch + (′a′- ′A′):ch  Soubor se preprocesorem rozvine takto: ch = ((ch) >= ′A′ && (ch) <= ′Z′) ? Ch + (′a′- ′A′):ch

14 Makra s parametry  Argument v definici makra je nutné uzavírat do závorek.  V opačném případě velká šance vzniku chyb.  Špatně:  Definice: #define mocnina(x) x * x  Volání: mocnina(f + g)  Rozvinutí: f + g * f + g  Správně:  Definice: #define mocnina(x) ((x) * (x))  Volání: mocnina(f + g)  Rozvinutí: ((f + g) * (f + g))

15 Předdefïnovaná makra  Jazyk C obsahuje nejen řadu předdefinovaných funkcí, ale i makra.  Makra pro konverzi znaků:  Definovány v souboru ctype.h  tolower - konverze na malá písmena  toupper - konverze na velká písmena  toascii - převod na ascii (pouze posledních 7b)

16 Předdefïnovaná makra  Makra pro určení typu znaků:  Definovány v souboru ctype.h  isdigit - testuje, zda daný znak je číslice  islower - testuje, zda je malé písmeno  isupper - testuje, zda je velké písmeno  … - …

17 Vkládání souborů  Příkaz include  obsah zdrojového souboru soubor bude vložen do místa, kde byla volána direktiva include

18 Vkládání souborů  Příkaz #include ″konstanty.h″  Hledá soubor konstanty.h ve složce, kde je uložen volající soubor. Pokud není nalezen, pokračuje se v hledání v dalších složkách dle aktuálního nastavení

19 Vkládání souborů  Příkaz #include  Hledá soubor stdio.h v systémové složce.  Použití pro standardní hlavičkové soubory.

20 Vkládání souborů  Standardní hlavičkové soubory:  Obsahují definice funkcí, konstant a maker ze standardní knihovny  Definovány ANSI normou  Použití hlavičkových souborů v souladu s ANSI normou by mělo zajistit 100% přenositelnost mezi nejrůznějšími PC a OS

21 Vkládání souborů  Standardní hlavičkové soubory:  Neobsahují celé konstrukce funkcí, ale pouze jejich hlavičky (tzv. funkční prototypy) – popisy jaké má funkce parametry a jaký datový typ vrací  Většinou uloženy ve složce \include  Např. v MS Visual C EXPRESS: C:\Program Files\Microsoft Visual Studio 9.0\VC\include\

22 Oddělený překlad souborů Vkládání souborůOddělený překlad

23 Oddělený překlad souborů  Každý soubor se překládá zvlášť – vzniká více.obj souborů  Využití u větších projektů  Při opakovaném překladu je přeložen pouze ten soubor, který byl změněn

24 Podmíněný překlad  Testuje hodnotu logického výrazu  Syntaxe: #if konstantní_výraz část_1 #else část_2 #endif

25 Podmíněný překlad  Příklad 1: #define LADENI 1 #if LADENI printf(″Hodnota: %d″,i); #endif

26 Podmíněný překlad  Příklad 2: #define WINDOWS 1 #if WINDOWS #define CESTA ″C:\\program\\data″ #else #define CESTA ″/program/data″ #endif

27 Podmíněný překlad  Testuje, zda je dané makro definováno  Syntaxe: #ifdef konstantní_výraz část_1 #else část_2 #endif

28 Podmíněný překlad  Příklad: #define WINDOWS 0 #ifdef WINDOWS #define CESTA ″C:\\program\\data″ #else #define CESTA ″/program/data″ #endif

29 Podmíněný překlad  Testuje, zda dané makro není definováno  Syntaxe: #ifndef konstantní_výraz část_1 #else část_2 #endif

30 Podmíněný překlad  Příklad: #ifndef DEFINICE #define DEFINICE 1 #define PI 3.14 #define CESTA ″C:\\program\\data″ #endif

31 Podmíněný překlad  Operátor defined  Pokud chceme kontrolovat více definic zároveň – umožňuje spojování logickými operátory #if defined(KONST_1) && defined(KONST_2) #define KONST_3 3 #endif

32 Podmíněný překlad  #elif  Stejný význam jako u else-if v mnohonásobném větvení  #error  Výpis textu preprocesorem na standardní výstup chybových hlášení

33 Podmíněný překlad #if LADENI==1 printf("Provedla se 1.cast\n"); #elif LADENI==2 printf("Provedla se 2.cast\n"); #elif LADENI==3 printf("Provedla se 3.cast\n"); #else #error Neplatna hodnota konstanty LADENI! printf("Nebyla provedena zadna cast\n"); #endif

34 A1PCJ-s 07. Preprocesor Děkuji za pozornost Ing. Michal Heczko 218/U3 Prezentace k dispozici na Uživatelské jméno: student Heslo: utb


Stáhnout ppt "PROGRAMOVÁNÍ V C JAZYKU - SEMINÁŘ Ing. Michal"

Podobné prezentace


Reklamy Google