PROGRAMOVN V C JAZYKU SEMIN Ing Michal Heczko

  • Slides: 34
Download presentation
PROGRAMOVÁNÍ V C JAZYKU - SEMINÁŘ Ing. Michal Heczko heczko@fai. utb. cz

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.

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ů

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

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

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

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

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

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

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()

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

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ší

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í:

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

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.

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 …

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

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

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

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

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

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

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í

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

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:

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

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

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:

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,

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

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

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

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");

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

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