Stáhnout prezentaci
Prezentace se nahrává, počkejte prosím
1
Programování v C jazyku - SEMINÁŘ
Ing. Michal Heczko
2
Preprocesor jazyka C 7 Programování v C jazyku – SEMINÁŘ
Ing. Michal Heczko
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 Zpracování programu
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 Preprocesor
6
Makra bez parametrů Úvod 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 / Úvod
7
Makra bez parametrů Příklady
#define PI 3.14 #define DVE_PI (2*PI) #define MOD % #define JMENO ″Michal″ #define ERROR {printf(″Chyba″);} Příklady
8
Makra bez parametrů Poznámky 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 Poznámky
9
Makra bez parametrů Ukončení platnosti makra
Ukončení platnosti makra – příkaz #undef Příklad: #define POCET 20 #undef POCET #define POCET 30 Ukončení platnosti makra
10
Makra bez parametrů Ukázka 1
#include <stdio.h> #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; } Ukázka 1
11
Makra bez parametrů Ukázka 2
#include <stdio.h> #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; Ukázka 2
12
Makra s parametry Úvod 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 Úvod
13
Makra s parametry Syntaxe Obecná syntaxe: Příklad použití:
#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 Syntaxe
14
Makra s parametry Závorky
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)) Rozvinutí: ((f + g) * (f + g)) Závorky
15
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 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) Předdefinovaná makra
16
Předdefïnovaná makra Předdefinovaná 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 … - … Předdefinovaná makra
17
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 Úvod
18
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í Tvary příkazu include
19
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. Tvary příkazu include
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 Standardní hlavičkové soubory 1
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\ Standardní hlavičkové soubory 2
22
Oddělený překlad souborů
Vkládání souborů Oddělený překlad Jak se liší od vkládání souborů?
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 Oddělený překlad souborů
24
Podmíněný překlad Testuje hodnotu logického výrazu Syntaxe:
#if konstantní_výraz část_1 #else část_2 #endif Řízení hodnotou konst. výrazu
25
Podmíněný překlad Příklad 1: #define LADENI 1 #if LADENI
printf(″Hodnota: %d″,i); #endif Řízení hodnotou konst. výrazu
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 Řízení hodnotou konst. výrazu
27
Podmíněný překlad Testuje, zda je dané makro definováno Syntaxe:
#ifdef konstantní_výraz část_1 #else část_2 #endif Řízení definicí makra
28
Podmíněný překlad Příklad: #define WINDOWS 0 #ifdef WINDOWS
#define CESTA ″C:\\program\\data″ #else #define CESTA ″/program/data″ #endif Řízení definicí makra
29
Podmíněný překlad Testuje, zda dané makro není definováno Syntaxe:
#ifndef konstantní_výraz část_1 #else část_2 #endif Řízení definicí makra 2
30
Podmíněný překlad Příklad: #ifndef DEFINICE #define DEFINICE 1
#define PI 3.14 #define CESTA ″C:\\program\\data″ #endif Řízení definicí makra 2
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 Operátor defined
32
Podmíněný překlad #elif #error
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í #elif a #error
33
Podmíněný překlad Příklad
#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 Příklad
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
Podobné prezentace
© 2024 SlidePlayer.cz Inc.
All rights reserved.