Preprocesor: Porovnání verzí

Smazaný obsah Přidaný obsah
m opraven odkaz na jazyk ALGOL - vedl na hvězdu
značky: první editace editace z Vizuálního editoru
m Robot: -zastaralá značka HTML; kosmetické úpravy
Řádek 1:
'''Preprocesor''' je [[počítačový program]], který zpracovává vstupní data tak, aby výstup mohl dále zpracovávat jiný program. Preprocesor je často používán pro předzpracování [[zdrojový kód|zdrojového kódu]] před vlastní [[Překladač|kompilací]]. Druh a míra předzpracování závisí zejména na schopnostech preprocesoru. Většina preprocesorů je relativně jednoduchá, zvládá nahrazování textu a jednoduchá [[Makro (software)|makra]]. Existují též sofistikované preprocesory, případně plně rozvinuté [[Programovacíprogramovací jazyk|programovací jazyky]]y.
 
Některé programovací jazyky (například [[C (programovací jazyk)|jazyk C]]) vždy používají preprocesor ve fázi, která se nazývá ''preprocesing''.
Řádek 11:
==== Připojení externích souborů ====
Preprocesoru v jazyce C/C++ se nejčastěji používá pro připojení [[Hlavičkový soubor|hlavičkových souborů]].
<sourcesyntaxhighlight lang="c">#include "…"</sourcesyntaxhighlight>
nebo
<sourcesyntaxhighlight lang="c">#include <…></sourcesyntaxhighlight>
Rozdíl mezi těmito příkazy je v umístění, kde bude preprocesor zadaný soubor hledat. „…“ značí lokální hlavičkový soubor v projektu. <…> znamená soubor umístěný v některém společném úložišti hlavičkových souborů pro všechny projekty.
Na ukázku, připojení souborů <code><[[math.h]]></code> a <code><[[stdio.h]]></code> ze standardní C/C++ knihovny umožňuje využívat matematické a I/O operace.
Řádek 25:
 
Na ukázku:
<sourcesyntaxhighlight lang="c">#define max(a,b) a > b ? a : b</sourcesyntaxhighlight>
definuje makro <tt>max</tt> se dvěma parametry <tt>a</tt> a <tt>b</tt>. Takovéto makro může být „voláno“ jako funkce (stejnou syntaxí).
Využití maker je v C/C++ velmi významné hlavně při ladění, kdy je možné rychle předefinovat makro a měnit tak kód na mnoha místech zároveň.
 
To, že se makra nechovají stejně jako funkce si ukážeme na následujícím příkladu, kde <tt>f</tt> a <tt>g</tt> jsou dvě funkce vracející integer. Zavolání <sourcesyntaxhighlight lang="c">z = max(f(), g());</sourcesyntaxhighlight>
nevyčíslí <tt>f()</tt>jednou a <tt>g()</tt> taky jednou jak by se dalo čekat u funkce, nýbrž jedna z funkcí <tt>f</tt> nebo <tt>g</tt> bude vyčíslena dvakrát (v závislosti na tom, která vrací větší číslo). Toto chování může mít za následek katastrofální chování v případě, že záleží na počtu volání <tt>f</tt> nebo <tt>g</tt>.
 
Řádek 38:
 
Nejčastěji se používá následující konstrukce:
<sourcesyntaxhighlight lang="c">
#ifndef SOUBOR_H
#define SOUBOR_H
…(zdrojový kód hlavičkového souboru)…
#endif
</syntaxhighlight>
</source>
Programátor tím zabraňuje mnohonásobnému připojení hlavičkového souboru. Tímto problémem jsme se zabývali výše.
 
Podmíněný překlad je možné využít v komplexnějších případech jako je tento:
<sourcesyntaxhighlight lang="c">
#ifdef DEBUG
Řádek 53:
#endif
</syntaxhighlight>
</source>
nebo
<sourcesyntaxhighlight lang="c">
#if DEBUG
Řádek 61:
#endif
</syntaxhighlight>
</source>
 
Většina moderních programovacích jazyků odstraňuje tuto schopnost a uchyluje se k tradičnímu použití <code>if…then…else…</code>. To má za následek pomalejší běh programu, neboť podmínka musí být vyhodnocena za běhu programu a nikoliv pouze při kompilaci.