Preprocesor
Preprocesor je nástroj, který zpracuje zdrojový kód před samotným překladem. Nekontroluje syntaktickou správnost programu. V konečném důsledku jde o úpravu textu, jeho výsledkem je tedy upravený text programu. Některé operace provádí preprocesor automaticky (odstranění komentářů), další jsou vykonány použitím tzv. direktiv. Jedná se o příkazy pro preprocesor. Řádka, která je určena pro zpracování preprocesorem, musí začínat znakem #(hashmark). Uvedeme si nejčastěji používané direktivy.
Direktiva #define
Pomocí direktivy #define můžeme definovat tzv. symbolické konstanty. Jde v podstatě o pojmenování hodnoty, která se počas běhu programu nemění. Je vhodné dodržovat pravidla:
- jména konstant píšeme velkými písmeny
- symbolické konstanty definujeme na začátku zdrojového kódu
- za hodnotou by měl být komentář vysvětlující její význam
- za hodnotou není středník
Příklady definice symbolických konstant
#define MAX 10  //max.rozsah pole
#define SOUBOR "data.txt" //nazev souboru
#define PI 3.14
#define KONC_ZNAK '*' //ukonceni zadavani textu
Symbolickým konstantám říkáme taky makra bez parametrů. Makra s parametry se používájí podobně jako jednoduché krátké funkce. Na rozdíl od symbolických konstant píšeme názvy malými písmeny.
Př. Makro s parametrem, které testuje, zda znak je velké písmeno
#define je_velke(c) ((c) >= 'A' && (c) <= 'Z') //testuje, zda znak je velke pismeno
Pokud bychom se podívali na definici některých standardních funkcí, zjistíme, že se nejedná o funkce, ale o makra s parametry např. getchar(), isdigit(), ...
Všechna makra se preprocesorem vyhodnocují jako náhrada textu. Preprocesor projde celý celý zdrojový kód a nahradí všechny výskyty názvu konstanty její hodnotou, uvedenou na místě definice.
Direktiva #include
Pomocí direktivy #include vložíme do zdrojového souboru obsah jiného souboru. Soubor se vkládá na místo, kde je uveden příkaz #include. Nejčastěji vkládáme do programu hlavičkové soubory. To se provádí dvěmi způsoby:
#include <stand_soubor.h>
#include "uziv_soubor.h"
Názvy standardních hlavičkových souborů píšeme ve špičatých závorkách. Soubor je potom vyhledáván v systémovém adresáři. Názvy uživatelských hlavičkových souborů píšeme nejčastěji v uvozovkách, soubor je vyhledáván v adresáři, kde je uložený zdrojový kód.
Hlavičkové soubory
Jedná se o textové soubory s příponou .h. Můžeme použít standardní hlavičkové soubory (stdio.h, stdlib.h, string.h, ctype.h, ...) nebo si vytvořit vlastní. Obsahují především:
- deklarace funkcí (hlavičky funkcí)
- definice symbolických konstant
- definice nových datových typů
- definice tříd
- vložení jiných hlavičkových souborů
Při vytváření uživatelských hlavičkových souborů je vhodné zabránit vícenásobnému vložení hlavičkového souboru do programu. To se může lehce stát např. při tvorbě projektů.
#ifndef _HLAVICKA
#define _HLAVICKA
/* obsah hlavickoveho souboru */
#endif
Při prvním vložení našeho hlavičkového souboru se definuje konstanta HLAVICKA, která ve spolupráci s direktivou #ifndef zabrání opětovnému natažení obsahu souboru. Název konstanty je vhodné volit s podle názvu hlavičkového souboru.
Poznámky k vytváření projektů:
Projekt obsahuje nekolik souvisejících souborů. Funkce main() se vyskytuje jenom jednou a to nejčastěji v tzv. hlavním programu. Ke každému hlavičkovému souboru vytváříme ještě jeden soubor a to s příponou .c nebo .cpp, který obsahuje definice všech funkcí deklarovaných v odpovídajícím hlavičkovém souboru.
Do hlavního programu vkládáme pomocí #include hlavičkové soubory a následně můžeme v kódu použít námi definované funkce. Hlavičkové soubory nám potom slouží jako "knihovna". Je vhodné uvést v komentářích hlavičkového souboru popis použití funkcí.