PROGRAMOVN V C JAZYKU SEMIN Ing Michal Heczko
- Slides: 34
PROGRAMOVÁNÍ V C JAZYKU - SEMINÁŘ Ing. Michal Heczko heczko@fai. utb. cz
7 Preprocesor jazyka C Programování v C jazyku – SEMINÁŘ Ing. Michal Heczko heczko@fai. utb. cz
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
Zpracování programu Preprocesor jazyka C
Základní činnost preprocesoru Preprocesor 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
Makra bez parametrů Symbolické konstanty Příkaz #define Pravidla pro psaní konstant: Úvod 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 /
Makra bez parametrů #define PI 3. 14 #define DVE_PI (2*PI) #define MOD % Příklady #define JMENO ″Michal″ #define ERROR {printf(″Chyba″); }
Makra bez parametrů Poznámky: hodnotami není středník Mezi jménem konstanty a hodnotou se nepíše znak „=“ Konstanta platí od místa definice do konce souboru Poznámky Za
Ukončení platnosti makra Makra bez parametrů Ukončení platnosti makra – příkaz #undef Příklad: #define POCET 20 #undef POCET #define POCET 30
Makra bez parametrů #include <stdio. h> #define PI 3. 14 Ukázka 1 int main() { double r = 6. 5; double v = 2. 1; printf(″Objem valce je %f!″, PI*r*r*v); return 0; }
Makra bez parametrů #include <stdio. h> #define POSUN (′a′-′A′) #define KONEC_R ′n′ Ukázka 2 int main() { int c; while ((c = getchar()) != KONEC_R) { if (c >= ′a′ && c <= ′z′) putchar(c-POSUN); else putchar(c); } return 0; }
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 Úvod Na rozdíl od funkcí preprocesor nahradí jméno makra v programu konkrétním textem
Makra s parametry Obecná syntaxe: #define jmeno_makra(arg 1, …, arg. N) hodnota_makra Příklad použití: #define je_velke(c) ((c) >= ′A′ && (c) <= ′Z′) Syntaxe ch = je_velke(ch) ? ch + (′a′- ′A′): ch Soubor se preprocesorem rozvine takto: ch = ((ch) >= ′A′ && ′A′): ch (ch) <= ′Z′) ? Ch + (′a′-
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ě: Závorky Definice: Volání: Rozvinutí: #define mocnina(x) mocnina(f + g) f + g * f + g x * x #define mocnina(x) mocnina(f + g) ((f + g) * (f + g)) ((x) * (x)) Správně: Definice: Volání: Rozvinutí:
Předdefïnovaná makra Předdefinovaná makra Jazyk C obsahuje nejen řadu předdefinovaných funkcí, ale i makra. Makra pro konverzi znaků: Definovány tolower toupper toascii v souboru ctype. h - konverze na malá písmena - konverze na velká písmena - převod na ascii (pouze posledních 7 b)
Předdefïnovaná makra Předdefinovaná makra Makra pro určení typu znaků: Definovány isdigit islower isupper … v souboru ctype. h - testuje, zda daný znak je číslice - testuje, zda je malé písmeno - testuje, zda je velké písmeno -…
Vkládání souborů Úvod Příkaz include obsah zdrojového souboru soubor bude vložen do místa, kde byla volána direktiva include
Vkládání souborů Tvary příkazu include 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í
Vkládání souborů Tvary příkazu include Příkaz #include <stdio. h> Hledá soubor stdio. h v systémové složce. Použití pro standardní hlavičkové soubory.
Standardní hlavičkové soubory 1 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
Standardní hlavičkové soubory 2 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++ 2008 EXPRESS: C: Program FilesMicrosoft Visual Studio 9. 0VCinclude
Jak se liší od vkládání souborů? Oddělený překlad souborů Vkládání souborů Oddělený překlad
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
Podmíněný překlad Řízení hodnotou konst. výrazu Testuje hodnotu logického výrazu Syntaxe: #if konstantní_výraz část_1 #else část_2 #endif
Podmíněný překlad Řízení hodnotou konst. výrazu Příklad 1: #define LADENI 1 #if LADENI printf(″Hodnota: %d″, i); #endif
Podmíněný překlad Řízení hodnotou konst. výrazu Příklad 2: #define WINDOWS 1 #if WINDOWS #define CESTA ″C: \program\data″ #else #define CESTA ″/program/data″ #endif
Podmíněný překlad Syntaxe: #ifdef konstantní_výraz část_1 #else část_2 #endif Řízení definicí makra Testuje, zda je dané makro definováno
Podmíněný překlad Příklad: Řízení definicí makra #define WINDOWS 0 #ifdef WINDOWS #define CESTA ″C: \program\data″ #else #define CESTA ″/program/data″ #endif
Podmíněný překlad Syntaxe: #ifndef konstantní_výraz část_1 #else část_2 #endif Řízení definicí makra 2 Testuje, zda dané makro není definováno
Podmíněný překlad Řízení definicí makra 2 Příklad: #ifndef DEFINICE #define DEFINICE 1 #define PI 3. 14 #define CESTA ″C: \program\data″ #endif
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) #define KONST_3 #endif && defined(KONST_2) 3
Podmíněný překlad #elif #error #elif a #error Stejný význam jako u else-if v mnohonásobném větvení Výpis textu preprocesorem na standardní výstup chybových hlášení
Podmíněný překlad #if LADENI==1 printf("Provedla se 1. castn"); #elif LADENI==2 printf("Provedla se 2. castn"); #elif LADENI==3 printf("Provedla se 3. castn"); #else #error Neplatna hodnota konstanty LADENI! Příklad printf("Nebyla provedena zadna castn"); #endif
A 1 PCJ-s 07. Preprocesor Děkuji za pozornost Ing. Michal Heczko heczko@fai. utb. cz 218/U 3 Prezentace k dispozici na http: //vyuka. qsh. eu Uživatelské jméno: student Heslo: utb
- Michal heczko
- Chutove bunky na jazyku
- Prizvucne a neprizvucne
- Klasifikace jazyků
- Typologická klasifikace jazyků
- Michal bick
- Michal meniny
- Michal kolcun
- Michal avny
- Michal lehnert
- Druhy ludovych piesni
- Michal hrab
- Michal kalman vek
- Michal miloslav hodža
- Michal tulek
- Michal inbar-feigenberg
- Michal kompan
- Michal segalov
- Michal tkaczyk
- Michal sipko
- Ttpet
- Michal irani
- Periculum est emptoris
- Michal skloňování
- Michal cyprian
- Pranostika michal
- Michal kolcun
- Ronen basri
- Michal veselovsky
- Michal simon
- Michal melich
- Hrábě skloňování vzor
- Michal hozza
- Michal drobot
- Michal skloňování