Obsah
Preprocesor zpracovává hlavičkové soubory, rozvíjí makra, nepropouští komentáře a umožňuje provádět podmíněný překlad zdrojového textu. Preprocesor předchází překladač. Preprocesor zpracovává vstupní text jako text, provádí v něm textové změny a jeho výstupem je opět text. Od preprocesoru tedy nemůžeme čekat kontrolu syntaxe, natož pak typovou kontrolu.
Preprocesor přijímá následující direktiva:
Direktiva preprocesoru není příkaz jazyka C. Neukončujeme ji proto středníkem. Direktiva preprocesoru musí být vždy uvozena znakem #. # navíc musí být na řádku prvním jiným znakem než jsou odsazovače. Od direktivy samotné jej opět mohou oddělovat odsazovače.
Potřebné znalosti | |
K zvládnutí obsahu této kapitoly je nutné mít znalosti z kapitoly 2 až 7 - pochopit doposud probíranou teorii. Umět psát programy umožňující vstup a výstup řádku a to jak formátovaných tak standardních. A umět také provádět vstupně výstupní operace v paměti. |
Makra se v programech využívají velice často a to proto, že zbavují programy tzv. "Magických čísel", tj. konstant, které se bez vysvětlení objevují v programu. Většinou jsou konstanty použity na začátku programu a jejich rozumné použití zvyšuje čitelnost zdrojového kódu.
Makra využíváme hlavně pro:
|
Pokud se text makra nevejde na jeden řádek, můžeme jej rozdělit na více následujících řádků. Skutečnost, že makro pokračuje na následujícím řádku, se určí umístěním znaku \ jako posledního znaku na řádku.
Pokud Váš překladač splňuje normu ISO C, bude mít nejméně pět předdefinovaných maker, která lze v programech použít. Jsou to:
Ukážeme si program, který předvádí výše popsaná makra.
Příklad 8.1. | |
/****************************** * c_macros.c * 19.03.2002 ******************************/ #include <stdio.h> int main(void) { printf("Preklad: %s, radek: %d, dne: %s, v: %s", __FILE__, __LINE__, __DATE__, __TIME__); return 0; } |
Je důležité vědět, že hodnoty maker jsou pevně určeny v době překladu. Proto bude program vypisovat neustále stejné hodnoty bez ohledu na to, kdy bude spuštěn. Hlavní využití těchto maker je pro vytváření časových a datumových razítek, která ukazují, kdy byl daný program přeložen.
Preprocesor může během své činnosti vyhodnocovat, je-li nějaké makro definováno či nikoliv. Při použití klíčového slova preprocesoru defined pak může spojovat taková vyhodnocení do rozsáhlejších logických výrazů. Argument defined nemusí být uzavřen do závorek. Může se však vyskytnout jen za #if nebo #elif.
Příklad: | |
#if defined LIMIT && defined OSTRA && LIMIT==10 |
V závislosti na splnění či nesplnění podmínky můžeme určit, bude-li ohraničený úsek programu dále zpracován, nebo bude-li přeskočen a tak nebude přeložen. Této možnosti použití preprocesoru říkáme podmíněný překlad.
Direktivy které můžeme použít u podmíněného překladu:
Části zapsané v hranatých závorkách [] jsou nepovinné. Část označená jako text musí být vyhodnotitelná při činnosti preprocesoru.
Vždy musí být jasno, kde podmíněná část zdrojového textu začíná a kde končí. Proto nesmíme zapomínat na #endif či #elif. Podmíněné části musí být ukončeny a omezeny v rámci jednoho zdrojového textu. Jinak oznámí preprocesor chybu. Dále je zde oproti C zavedena i podmínka #elif.
Napíšeme si program na kterém si demonstrujeme pravidla podmíněného překladu. Naším úkolem bude zobrazit samotnou ASCII sadu, nebo sadu rozšířenou na základě hodnoty obsažené v proměnné CHAR_SET.
Příklad 8.2. | |
/****************************** * cond_trn.c * 19.03.2002 ******************************/ #include <stdio.h> /* Definujem CHAR_SET jako 256 nebo 128 */ #define CHAR_SET 256 int main(void) { int i; #if CHAR_SET == 256 printf("Zobrazeni uplne sady ASCII znaku plus rozsireni.\n"); #else printf("Zobrazeni jen samotne sady ASCII znaku.\n"); #endif for(i=0;i<CHAR_SET;i++) printf("%c ",i); return 0; } |
Makro #include je direktivou naprosto nepostradatelnou. Používáme ji pro včlenění zdrojového textu jiného souboru. Tento soubor může být určen více způsoby.
|
Makro #pragma je speciální direktivou, která má uvozovat všechny implementačně závislé direktivy. Pokud jiný překladač speciální direktivu nezná, prostě ji bez chybového stavu ignoruje.
Shrnutí | |
Preprocesor jazyka C
A dále:
|