Preprocesor: Porovnání verzí

Přidány 3 bajty ,  před 9 lety
m
typo
m (napřímení odkazu)
m (typo)
Zmíněný lexikální preprocesor není schopný sám ohlídat vícenásobné připojení jednoho hlavičkového souboru nebo dokonce cyklické připojování hlavičkových souborů. Mnohonásobné připojení musí v tomto případě ohlídat programátor za pomocí podmíněného překladu. Mimo jiné je tento přístup pomalý, neboť je nutné před každou kompilací připojovat hlavičkové soubory i když se v nich nic nezměnilo.
 
Od roku 1970, bylo vymyšleno mnoho alternativ hlavičkových souborů z jazyka C/C++. Tyto alternativy jsou mnohdy efektivnější, rychlejší a použití je přehlednější. Vybrané implementace sdílených souborů: [[Java (programovací jazyk)|Java]] a [[Common Lisp]] používají balíčky, [[Pascal (programovací jazyk)|Pascal]] má unity, [[Modula-2|Modula]], [[OCaml]], [[Haskell (programovací jazyk)|Haskell]] a [[Python]] mají moduly a [[C Sharp|C#]] využívá importy jmenýchjmenných prostorů z připojených knihoven.
 
==== Makra ====
Makra jsou primárně používána v jazyce C. Umožňují vkládat drobné části kódu na mnoho míst, čímž se šetří velikost zdrojového kódu a přehlednost. V makrech je možné používat i zástupné znaky (něco jako parametry funkcí). Makra jsou zpracovávána preprocesorem, proto je tento kód kompilovámkompilován vícekrát, i když je zapsán pouze jednou. Makra nemají vliv na rychlost překladu.
 
Na ukázku:
<source lang="c">#define max(a,b) a > b ? a : b</source>
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 zaroveň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í <source lang="c">z = max(f(), g());</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 kompexnějšíchkomplexnějších případech jako je tento:
<source lang="c">
#ifdef DEBUG
Pěkný příklad naleznete na internetové adrese http://caml.inria.fr/pub/docs/manual-camlp4/manual007.html. Program může být zapsán dvěma různými syntaxemi při zachování stejné funkčnosti a záleží hlavně na subjektivním posouzení programátorem.
 
Velký počet programů napsaných v [[OCaml]] přispůsobujepřizpůsobuje syntaxi doplněním nových operátorů. Definici vlastních operátorů podporuje i jazyk C++.
 
=== Specializace jazyka ===