Fotografický magazín "iZIN IDIF" každý týden ve Vašem e-mailu.
Co nového ve světě fotografie!
Zadejte Vaši e-mailovou adresu:
Kamarád fotí rád?
Přihlas ho k odběru fotomagazínu!
Zadejte e-mailovou adresu kamaráda:
C/C++
Učíme se C (6.díl)
2. října 2000, 00.00 | Tentokrát o preprocesoru jazyka C a jeho direktivách #include
a #define.
Preprocesor jazyka C
Jistou zvláštností jazyka C je jeho preprocesor. Ten ještě před samotným překladem zdrojový soubor upraví a teprve upravený soubor je předán překladači. Mezi úpravy, které preprocesor provádí se řadí především substituce textu, odstraňování komentářů a podmíněný překlad.
Činnost preprocesoru řídíme pomocí tzv. direktiv preprocesoru. Každá direktiva je uvozena znakem ‚#’, který musí být uveden hned jako první znak na řádku. Tak určíme, že zbytek řádku je určen preprocesoru a zápisy v něm se tedy řídí jeho syntaktickými pravidly, která nejsou totožná s těmi céčkovskými.
Direktiva #include
#include <soubor> nebo #include "soubor"
S touto direktivou jste se pravděpodobně už setkali. Pokud preprocesor narazí na výskyt direktivy #include, nahradí ji obsahem určeného souboru. To se nejčastěji používá pro vkládání tzv. hlavičkových souborů s deklaracemi funkcí apod., nebo přímo jiných zdrojových souborů C. Jak jste si jistě všimli, je možné v zápisu direktivy ohraničit jméno souboru buď lomenými závorkami, nebo uvozovkami. Pokud použijete zápisu se závorkami a nespecifikujete úplnou cestu k souboru, bude soubor hledán ve standardním adresáři pro ukládání hlavičkových souborů. Použijete-li zápis s uvozovkami, bude soubor hledán nejdříve v adresáři se zdrojovým souborem a pak teprve v adresáři s hlavičkovými soubory.
Je nutné ještě poznamenat, že použití direktivy #include může být vnořené, to znamená, že i ve vkládaném souboru se mohou vyskytovat další direktivy #include. Ty pak budou také zpracovány. Hloubka vnoření bývá omezena, nicméně 8 vnoření by dnes měl zvládnout každý preprocesor. Je ale třeba dát si pozor na cyklická vnoření.
Direktiva #define
#define identifikátor_makra text_makra
Tato direktiva se používá pro vytváření tzv. maker. Použitím této direktivy říkáme preprocesoru, aby každý následující výskyt identifikátoru makra ve zdrojovém souboru nahradil textem makra. Výjimkou jsou ale ty výskyty identifikátoru makra, které se nacházejí v řetězcích a poznámkách. Text makra začíná přesně po první mezeře po identifikátoru makra. Pokud tedy oddělíme identifikátor a text makra více mezerami, bude pouze první považována za oddělovač a ostatní znaky budou patřit textu makra.
Makra se často používají pro definování tzv. symbolických konstant, kdy místo konstanty používáme nějaké symbolické jméno, které bylo dříve použito v direktivě #define jako identifikátor makra a jako text makra pak byla použita skutečná hodnota konstanty. Ještě před překladem tak budou všechny výskyty tohoto symbolického jména nahrazeny skutečnou hodnotou.
#define PI 3.141592653 #define PI2 (2*PI) #define MAX 2+PI
Jak vidíte, mohou se v textu makra vyskytovat jiné již dříve nadefinované identifikátory maker.
Předpokládejme, že máme ve svém zdrojáku nadefinována makra z předchozího příkladu a že tam máme také následující řádky:
double c; printf ("Cislo PI "); c = PI; c = 2 * MAX;
Po zpracování preprocesorem bude předchozí zápis vypadat takto:
double c; printf ("Cislo PI "); c = 3.141592653; c = 2 * 2+3.141592653;
V parametru funkce printf nebylo nahrazení textem makra provedeno, protože v řetězcích se nahrazování neprovádí. V následujícím řádku však záměna už provedena byla. Stejně tak i v posledním řádku, ale zde možná ne tak, jak jsme předpokládali. Ačkoliv z původního zápisu se zdá, že celá hodnota MAX je vynásobena dvěmi, po rozvinutí je jasné, že nejdříve jsou vynásobeny obě dvojky a k tomu je teprve přičtena hodnota 3.141592653.
Nedorozumění bychom předešli, kdybychom makro nadefinovali takto:
#define MAX (2+PI)
Obsah seriálu (více o seriálu):
- Učíme se C (1. díl)
- Učíme se C (2. díl)
- Učíme se C (3.díl)
- Učíme se C (4. díl)
- Učíme se C (5.díl)
- Učíme se C (6.díl)
- Učíme se C (7.díl)
- Učíme se C (8.díl)
- Učíme se C (9.díl) - Řetězce
- Učíme se C (10.díl) - Vstupně výstupní funkce
- Učíme se C (11.díl) - Formátovaný výstup
- Učíme se C (12.díl) - Formátový specifikátor
- Učíme se C (13.díl)
- Učíme se C (14.díl) - Vícerozměrná pole
- Učíme se C (15.díl) - Ukazatele
- Učíme se C (16.díl) - Modifikátory paměťové třídy
- Učíme se C (17.díl) - Pole a ukazatel
- Učíme se C (18. díl) - Dynamická alokace paměti
- Učíme se C (19. díl) - Práce se soubory I.
- Učíme se C (20. díl) - Práce se soubory II.
- Učíme se C (21. díl) - Parametry funkce main()
- Učíme se C (22. díl) - Ukazatele na funkce
- Učíme se C (23. díl) - Složité deklarace a definice
- Učíme se C (24. díl) - Funkce s proměnným počtem parametrů
- Učíme se C (25. díl) - Bitové operátory a bitové pole
- Učíme se C (26. díl) - Datové typy enum a union
- Učíme se C (27. díl - závěr) - Programové moduly
-
25. listopadu 2012
-
30. srpna 2002
-
10. října 2002
-
4. listopadu 2002
-
12. září 2002
-
25. listopadu 2012
-
28. července 1998
-
31. července 1998
-
28. srpna 1998
-
6. prosince 2000
-
27. prosince 2007
-
4. května 2007