www.amapro.cz & David Bazala [Programování]

Otevře webové stránky AmaPro


Otevře hlavní stránku společnosti AmaPro
Internetové stránky určené pro studenty středních a vysokých odborných škol.


amapro.cz/odkazy Projekt eliminuje vyhledávání klíčových slov na komerčních stránkách a v e-schopech.



Nový projekt AmaPro

#define

 

Je speciální příkaz C pro tzv. preprocesor, který probíhá ještě před vlastním překladem. Je to specifikace C, kterou například PASCAL nemá. Využití těchto speciálních příkazů ve zdrojových kódech zjednodušuje vizuální orientaci programátora. Preprocesor provádí jakousi substituci částí častěji se opakujících sekvencí zdrojového kódu. Občas mluvíme, že makro expanduje, nebo-li se rozvíjí.

 

Příklad jednořádkového makra:

 

#define MAKRO1 textova cast makra

 

{

:

MAKRO1;                  //se rozvine jako textova cast makra ;

:

}

 

U makra, které si definujeme a není delší než jeden řádek, lze použít této konstrukce příkazu #define. Názvy maker se z konvence píší velkými písmeny, nedělá se žádné rovná se a neukončuje se středníkem. Vývojová prostředí zpravidla řádky počínající # píšou jinou barvou.

 

Příklad víceřádkového makra:

 

#define MAKRO2 textova cast makra\

delsi nez jeden radek\

a  nesmi byt komentar 

 

{

:

MAKRO2;                  //se rozvine jako textova cast  makra  delsi nez jeden radek a nesmi byt komentar ;

:

}

 

U makra, které bude při definici delší a budeme ho rozkládat na dva a více řádků je zapotřebí použít speciální znak \ , který překladači říká, že makro nekončí, ale pokračuje na dalším řádku. Pozor na rozvinutí mezer a tabulátorů, které jsou v definici makra obsaženy. Je proto vhodnější psát text již od počátku nového řádku, i když to není moc přehledné. Tak též pozor na rozvíjení uvozovek, závorek a pod. Jedná se pouze o rozvíjení textu. Překladač bude respektovat rozvinutý text.

 

PŘÍKLAD: #define_1

#pragma hdrstop                                                                     //pomocná informace pro preprocesor

#include<iostream.h>                                                               //vložení jiného zdrojového kódu

//-------------------------------------------------------

#define LINE1 endl<<"****************"<<endl               //definování makra názvu LINE1

#define LINE2 endl<<"****************\

***********************\

        *****************"<<endl                                        //definování makra názvu LINE2

#pragma argsused                                                                   //pomocná informace pro preprocesor

int main(int argc, char* argv[])                                                    //hlavní funkce konzolové aplikace

{

int a=10;                                                                                       //alokace a inicializace proměnné a

int b=20;                                                                                      //alokace a inicializace proměnné b

cout<<a<<LINE1;                                                                     //výpis proměnné a s rozvojem makra

cout<<b<<LINE2;                                                                    //výpis proměnné b s rozvojem makra

getchar();                                                                                      //čekání na entr

return 0;                                                                                      //výstup z konzolové aplikace

}

 

Příklad demonstruje využití makra pro definování části zdrojového textu, obstarávající efektní oddělení řádků na monitoru. Pomocí #define jsou definovány dvě makra. Jednořádkové LINE1 a víceřádkové LINE2. Preprocesor v době zpracování zdrojového textu provede náhradu názvu makra LINE1 za před definovanou sekvenci znaků: endl<<"****************"<<endl. Zkuste si cvičně napsat nějaký komentář do definice makra. Po vložení // se vývojové prostředí nemusí chovat správně. Také si povšiměte, jak bude preprocesor respektovat bílé znaky u třetího řádku makra LINE2.

 

 

PŘÍKLAD: #define_2

#pragma hdrstop                                            //pomocná informace pro preprocesor

#include <iostream.h>                                      //vložení jiného zdrojového kódu

//------------------------------------------

#define m4(x) x*x*x*x                                      //definice makra s jedním parametrem

#define n4(x) x+x+x+x                                      //definice makra s jedním parametrem

#define o4(x) (x+x+x+x)                                    //definice makra s jedním parametrem

#pragma argsused                               //pomocná informace pro preprocesor

int main(int argc, char* argv[])                           //hlavní funkce konzolové aplikace

{

int a,b,c;                                                          //alokace proměnných

a=m4(2)+m4(3);                                             //a=2*2*2*2+3*3*3*3

cout<<a<<endl;                                               //výstup na obrazovku

b=n4(2)*n4(3);                                               //b=2+2+2+2*3+3+3+3

cout<<b<<endl;                                             //výstup na obrazovku

c=o4(2)+o4(3);                                               //c=(2+2+2+2)*(3+3+3+3)

cout<<c<<endl;                                               //výstup na obrazovku

getchar();                                                         //čekání na entr

return 0;                                                          //opuštění konzolové aplikace

}

 

 

Příklad ukazuje použití definice maker s jedním parametrem a demonstruje různé případy komplikací, které mohou nastat. Je nutné si uvědomit, že makra se rozvíjejí jako textové řetězce a proto ve výsledku dávají skládaný zdrojový kód. Překladač pracuje s tímto kódem dle standardů definovaných pro C. Může proto dojít k neuváženým omylům při používání těchto maker v domnění, že makro používáte jako funkci. Je proto dobré si rozepsat a uvědomit matematicko-logický význam rozvinutého makra. Náš případ maker m4, n4, a o4 se jeví visuálně velmi podobně, ale ve výsledku je rozdílný. Sledujte vliv priorit plus a krát a vliv závorek.

 

PŘÍKLAD: #define_3

#pragma hdrstop                                                                //pomocná informace pro preprocesor

#include <iostream.h>                                                          //vkládání jiného zdrojového souboru

//---------------------------------------------------------------------------

#define TELO1 {c=1;cout<<c<<"true";}                   //definice makra jako část těla

#define TELO2 {c=0;cout<<c<<"false";}                  //definice makra jako část těla

#pragma argsused                                                               //pomocná informace pro preprocesor

int main(int argc, char* argv[])                                   //hlavní funkce konzolové aplikace

{

int c;                                                                            //alokace proměnné c jako int

c=6;                                                                           //modifikace proměnné c na NULL

if(c)TELO1                                                                    //vkládá se text z makra TELO1

else TELO2                                                                    //vkládá se text z makra TELO2

getchar();                                                                    //čekání na entr

return 0;                                                                     //výstup z konzolové aplikace

}

 

Příklad demonstruje použití makra #define, které se bude rozvíjet v text prezentující zdrojový text jako příkazy. Použit je příkaz if-else, který testuje hodnotu int c. Je-li NULL přechází běh programu do makra TELO2, jinak probíhá makro TELO1. Je nutné si uvědomit, že se nejedná o žádný odskok do procedury či subrutiny. Preprocesor překladači dosadí onen předdefinovaný zdrojový text za příkazy #define. Povšimněte si jak je zde pracováno se závorkami bloků a středníky. Za jako-by voláním obsahu makra se nepíšou středníky.

 



Abecední seznam všech článků Vyhledání pojmů ve článcích




Mikropočítače
Seznámení s obecnou problematikou počítačů a mikropočítačů.
programovani/mikropocitace
Popis HTML formátu
Velikost textu, barva textu, rozvržení stránky, obrázky, barva pozadí se zapisuje pomocí HTML příkazů.
stranky/html_tag
Hybridní počítače
Počítače, jejichž základem je standardní analogová počítací síť.
knihy/hybridni_pocitace
Programování PHP
Články o programování webových stránek pomocí PHP.
internet/katalog_programovani_php
Databáze obrázků
Malé a velké obrázky, podlkady, tlačítka, okrasné čáry a pod.
datove_zdroje/obrazky
Popis jazaka C
Průvodce příkazy programovacího jazyka C.
programovani/jazyk_c
Mikropočítače a jejich programování
Nízká forma programování, assembler a struktura procesorů.
knihy/mikropocitace/obsah_mikro1.php
Weby o programování
Odkazy na velké servery o programování a vývoji SW
odkazy/programovani
Animované obrázky
Animované gify a malé obrázky pro všeobecné využití.
datove_zdroje/animace
Otevře stránky Fulltextové vyhledávání na celém serveru
Digitalizované odborné knihy
Velká encyklopedie pojmů a zkratek
Česko - anglicko - německý technický slovník
Klasický katalog firem, služeb a stránek
OnLine překladač  vět a textů (nepoužívá Google)
Stránky pro chvíle oddechu od studia, relaxace
Katalog českých firem dle technologií
Internetový odkazník
Otevře hlavní stranu pro oddíl programování




 Wikipedie   Seznam stránek   Kapitoly témat   Významné servery   Klíčová slova 








Otevře hlavní stranu společnosti AmaPro

Všechna práva vyhrazena. Určeno jen pro osobní využití. Bez předchozího písemného souhlasu správce www.amapro.cz je zakázána jakákoli další publikace, přetištění nebo distribuce jakéhokoli materiálu nebo části materiálu zveřejněného na www.amapro.cz a to včetně šíření prostřednictvím elektronické pošty. Články, jejichž přímým autorem není amapro.cz lze publikovat pouze se souhlasem jejich majitelů či administrátoru příslušného webu.