银河证券晨会纪要-180323
Makro (od ?macroinstruction“ z ?eckého slova ?μακρ?“ – ?velké“ nebo ?daleko“) je v informatice definice pravidla, jak bude vstupní posloupnost transformována na vystupní posloupnost (znak?, akcí, vypo?t? a podobně). Tuto transformaci ozna?ujeme jako substituci nebo expanzi makra. P?vodní termín byl zaveden p?eklada?i jazyka symbolickych adres, kde programátor m??e pomocí makra zaměnit dlouhou sekvenci p?íkaz? jedinym krátkym vyrazem (makrem).
Kancelá?sky balík
[editovat | editovat zdroj]V kancelá?skych balících (Microsoft Office, LibreOffice a podobně) ozna?uje makro posloupnost akcí, funkcí nebo p?íkaz?, které usnadňují ur?itou ?innost (nap?. v programech Microsoft Word a LibreOffice Calc). Pou?ívají se vět?inou jako posloupnost krok? p?i vypo?tech, úpravách textu a podobně. Jednoduchym p?íkladem m??e byt makro pro odstranění speciálních znak? tabulátor a od?ádkování nebo makro aktivující ur?itou akci po stisknutí vybrané kombinace kláves.
Programování
[editovat | editovat zdroj]V programovacích jazycích (jazyk C nebo C++) jsou makra nepostradatelnou pom?ckou, která je implementována na úrovni preprocesoru jazyka C (cpp). Makra slou?í k definování symbol? vyu?itelnych p?i podmíněném p?ekladu, ale i k definování komplikovanych sekvencí, které jsou následně volány v zápisu zdrojového kódu. Vyhodou maker je, ?e jejich p?edefinováním se p?i p?ekladu zdrojového kódu automaticky zamění v?echny jejich vyskyty, co? minimalizuje chyby, které by p?inesly mnohanásobné editace kódu.[1][2] Pou?ití makra také m??e u?et?it re?ii spojenou s voláním funkce. Nevyhodou je slab?í typová kontrola a p?ípadné vedlej?í efekty p?i nesprávném pou?ití maker. Z tohoto d?vodu se doporu?uje up?ednostňovat p?ed makry inline-funkce.
Makra jsou texty, které se dají p?edstavit jako zdrojové kódy. Ov?em jako se zdrojovymi kódy se s nimi pracuje a? po zpracování preprocesoru. V mnoha implementacích C-jazyka je preprocesor C-jazyka implementován jako samostatny program, v opera?ním systému Linux jej lze obvykle volat pod názvem cpp (C Pre Processor). Tento program nahrazuje ve zdrojovém kódu identifikátor makra jeho obsahem, tj. rozvojem textu makra. P?i rozvoji makra se v textu makra provádí substituce formálních parametr? makra za texty uvedené v závorce p?i volání makra.
Preprocesor je volán p?eklada?em, nebo je p?ímo jeho sou?ástí. Preprocesor odstraní ze zdrojového kódu komentá?e a nahradí makra, které jsou ve zdrojovém kódu. Nap?íklad kdy? zapí?ete do zdrojového kódu #include <stdio.h>
, pak preprocesor vlo?í na místo tohoto ?ádku hlavi?ka standardní knihovny <stdio.h>
. V?echny direktivy preprocesoru C-jazyka za?ínají znakem #.
Direktiva preprocesoru musí byt v?dy první na novém ?ádku. P?ed ní mohou byt maximálně jen ?bílé znaky“ (tabulátor, mezera, …). Direktiva kon?í s koncem ?ádku. Pokud chcete pokra?ovat na novém ?ádku, pak p?ed ?konec ?ádku“ napi?te zpětné lomítko.
Podle normy ANSI C existují následující makra, které musí ka?dy preprocesor jazyka C znát. Standardní makra preprocesoru za?ínají a kon?í dvěma podtr?ítky.
Makro | vyznam | datovy typ |
---|---|---|
__cplusplus__ | Ur?uje, zda byl pou?it p?eklada? C++ | int (1 nebo 0) |
__STDC__ | Ur?uje, zda p?eklada? splňuje ANSI C | int (1 nebo 0) |
__LINE__ | Po?adové ?íslo aktuálního ?ádku | int |
__FILE__ | Jméno aktuálního vstupního souboru | string |
__TIME__ | ?as spu?tění preprocesoru | string |
__DATE__ | Datum spu?tění preprocesoru | string |
Existují i implementa?ně závislá makra, která jsou definována jen na některych OS a v některych preprocesorech jazyka C. Nap?íklad makro __linux__
se m??e hodit ke zji?tění, zda program p?ekládáme v linuxu.
Makro | vyznam | datovy typ |
---|---|---|
__linux__ | Ur?uje, zda je zdrojovy kód p?ekládán v Linuxu | int (1 nebo 0) |
__unix__ | Obdobně jako linux | int (1 nebo 0) |
__MSDOS__ | Verse DOSu | string |
__i386__ | Ur?uje, zda jde o procesor z ?ady i386 | int (1 nebo 0) |
__VERSION__ | Verze p?eklada?e GNU C | string |
Existují dva typy maker:
Makra bez parametr?
[editovat | editovat zdroj]Pou?ívají se pro definici konstant, kdy se místo konstanty pou?ívá nějaké specifické slovo. Pou?ívané pravidlo v tomto p?ípadě je psát identifikátor makra bez parametru velkymi písmeny.
Kromě standardních maker se dají vytvá?et vlastní makra. Jejich u?ívání je velmi roz?í?ené, nap?íklad je lze pou?ít pro definování po?tu prvk? pole. Takové makro se pak pou?ívá v celém zdrojovém kódu a p?i změně po?tu prvk? pole sta?í změnit jen makro. Makro se definuje za direktivou #define
a lze jej zru?it direktivou #undef
.
#define NAZEV makro
zdrojovy kód kde makro pou?íváme
#undef NAZEV
zde u? makro není definované
Zápis takového makra pak vypadá:
#define identifikator_makra text_vlozeneho_makra
Volání takového makra pak vypadá:
Identifikator_makra
Makra s parametry
[editovat | editovat zdroj]Makra mohou mít také argumenty. Jsou uzav?eny v kulatych závorkách za jménem makra a pokud je více ne? jeden argument, jsou odděleny ?árkou. Mezi jménem makra a závorkou obsahující argumenty nesmí byt mezera.
#define NAZEV(argument1, argument2, …)
Obsahují formální parametry, se kterymi se v textu makra dále pracuje. ?asto se pou?ívají namísto funkcí. Rozdíl mezi makry a funkcí je ten, ?e makra jsou rychlej?í a za formální parametry mohou byt na?teny i hodnoty libovolnych datovych typ?. Pou?ívané pravidlo je psát identifikátor malymi písmeny.
Zápis takového makra pak vypadá:
#define identifikátor_makra(seznam formálních parametru) text_vlozeneho_makra
Volání takového makra pak vypadá:
identifikátor_makra(seznam skute?nych parametr?)
Alternativní jazyky
[editovat | editovat zdroj]Některé jazyky, jako t?eba PHP, mohou byt vlo?eny do libovolného textového formátu, nebo zdrojovych kód? jinych jazyk?. Mechanismus, kterym se rozpozná kód jazyka (nap?. v ji? zmíněném php: <?php
a ?>
) je podobny jako textové makro jazyka. Ale existují mnohem silněj?í plnohodnotné jazyky.
Reference
[editovat | editovat zdroj]- ↑ GREENWALD, Irwin D. The Share 709 System: Programming and Modification. Journal of the ACM. New York, NY, USA: ACM, April 1959, ro?. 6, ?ís. 2, s. 128–133. Dostupné online [PDF]. doi:10.1145/320964.320967. Quotation: "One of the important uses of programmer macros is to save time and clerical-type errors in writing sequence of instructions which are often repeated in the course of a program."
- ↑ STRACHEY, Christopher. A General Purpose Macrogenerator. Computer Journal. October 1965, ro?. 8, ?ís. 3, s. 225–241. doi:10.1093/comjnl/8.3.225.