Učíme se C (6.díl) - Builder.cz - Informacni server o programovani

Odběr fotomagazínu

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

Tématické zařazení:

 » Rubriky  » C/C++  

 

 

 

Nejčtenější články
Nejlépe hodnocené články

 

Přihlášení k mému účtu

Uživatelské jméno:

Heslo: