Kompilování programu v jazyce C – zákulisí
Preprocesor je systémový software (počítačový program, který je určen pro běh hardwaru počítače a aplikačních programů). Provádí předzpracování jazyka vysoké úrovně(HLL). Předzpracování je prvním krokem systému zpracování jazyka. Systém zpracování jazyka překládá jazyk vysoké úrovně do jazyka strojové úrovně nebo do absolutního strojového kódu(tj. do podoby srozumitelné stroji).
- Preprocesor nezná pravidla rozsahu jazyka C. Direktivy preprocesoru jako #define vstupují v platnost, jakmile jsou viděny, a zůstávají v platnosti až do konce souboru, který je obsahuje; bloková struktura programu je irelevantní.
Předprocesor provádí v kódu HLL především tři úkoly :
- Odstranění komentářů : Odstraní všechny komentáře. Komentář se píše pouze proto, aby člověk kódu porozuměl. Je tedy zřejmé, že pro stroj nemají žádný význam. Preprocesor je tedy všechny odstraní, protože při provádění nejsou potřeba a nebudou se také provádět.
Takto se zobrazí soubor s odstraněnými komentáři v Linuxu) :
Napište kód v jazyce C (název souboru nechť je prog.c). Předzpracujte jej příkazem gcc -E prog.c
Uvidíte výstup s kódem bez komentářů.
Tento soubor uložte s příponou ‚.i‘ (prog.i), který bude vstupovat do překladače. - Zahrnutí souborů : Zahrnutí všech souborů z knihovny, které náš program potřebuje. V HLL píšeme #include, což je direktiva pro preprocesor, která mu říká, aby zahrnul obsah zadaného souboru knihovny. Například příkaz #include řekne preprocesoru, aby zahrnul veškerý obsah knihovního souboru stdio.h.
Tento příkaz lze také zapsat pomocí dvojitých uvozovek – #include „stdio.h“
Poznámka: Pokud je název souboru uzavřen v hranatých závorkách, soubor se vyhledá ve standardních cestách zahrnutí překladače. Pokud je název souboru uzavřen do dvojitých uvozovek, je vyhledávací cesta rozšířena tak, aby zahrnovala aktuální adresář se zdroji. - Rozšíření maker : Makra lze volat jako malé funkce, jejichž zpracování není tak zatěžující. Pokud máme napsat funkci (mající malou definici), kterou je třeba rekurzivně (znovu a znovu) volat, pak bychom měli dát přednost makru před funkcí.
Definice těchto maker se tedy provádí pomocí preprocesoru.#define SI 1000
je jednoduchý příklad makra.
- Existují dva typy maker: Objektová (nepřijímají parametry) a funkční (mohou přijímat parametry)
// object-like macro#define // function-like macro #define ()
- Definici makra můžete odstranit pomocí #undef:
// delete the macro# undef
- Víceřádkové makro můžeme napsat stejně jako funkci, ale každý příkaz končí „\“.
#include <stdio.h>
#define MACRO(num, str) {\
printf
(
"%d"
, num);\
printf
(
" is"
);\
printf
(
" %s number"
, str);\
printf
(
"\n"
);\
}
- Existují dva typy maker: Objektová (nepřijímají parametry) a funkční (mohou přijímat parametry)
Tímto článkem přispěl Diksha. Pokud se vám GeeksforGeeks líbí a chtěli byste přispět, můžete také napsat článek pomocí stránky contribute.geeksforgeeks.org nebo poslat svůj článek na adresu [email protected]. Uvidíte, jak se váš článek objeví na hlavní stránce GeeksforGeeks, a pomůžete tak ostatním geekům.