Preprocesor jazyka C je makroprecesor (umožňuje definovat makra), který transformuje program před jeho kompilací. Těmito transformacemi může být začlenění hlavičkového souboru, rozšíření maker atd.
Všechny direktivy preprocesoru začínají symbolem #
. Například,
#define PI 3.14
Některé z běžných použití preprocesoru jazyka C jsou:
- Zapojení hlavičkových souborů: #include
- Makra pomocí #define
- Příklad 1. Ukázka: #define preprocessor
- Makra podobná funkci
- Příklad 2: Použití preprocesoru #define
- Podmíněná kompilace
- Použití kondicionálu
- Jak používat kondicionál?
- #ifdef Směrnice
- #if, #elif a #else Směrnice
- #defined
- Předdefinovaná makra
- Příklad 3: Získání aktuálního času pomocí __TIME__
- Doporučené čtení
Zapojení hlavičkových souborů: #include
Preprocesor #include
se používá k začlenění hlavičkových souborů do programů v jazyce C. Například
#include <stdio.h>
Tady stdio.h
je hlavičkový soubor. Direktiva preprocesoru #include
nahradí výše uvedený řádek obsahem hlavičkového souboru stdio.h
.
To je důvod, proč musíte před použitím funkcí jako scanf()
a printf()
použít #include <stdio.h>
.
Můžete si také vytvořit vlastní hlavičkový soubor obsahující deklaraci funkce a začlenit jej do programu pomocí této direktivy preprocesoru.
#include "my_header.h"
Navštivte tuto stránku, kde se dozvíte více o používání hlavičkových souborů.
Makra pomocí #define
Makro je fragment kódu, který je pojmenován. Makro můžete v jazyce C definovat pomocí direktivy #define
preprocesoru.
Tady je příklad.
#define c 299792458 // speed of light
Pokud v našem programu použijeme c, nahradí se 299792458
.
Příklad 1. Ukázka: #define preprocessor
#include <stdio.h>#define PI 3.1415int main(){ float radius, area; printf("Enter the radius: "); scanf("%f", &radius); // Notice, the use of PI area = PI*radius*radius; printf("Area=%.2f",area); return 0;}
Makra podobná funkci
Makra, která fungují podobně jako volání funkce, můžete také definovat. Jedná se o tzv. makra podobná funkci. Například
#define circleArea(r) (3.1415*(r)*(r))
Pokud se v programu setkáte s circleArea(argument)
, nahradí se (3.1415*(argument)*(argument))
.
Předpokládejme, že jsme jako argument předali 5, pak se expanduje takto:
circleArea(5) expands to (3.1415*5*5)
Příklad 2: Použití preprocesoru #define
#include <stdio.h>#define PI 3.1415#define circleArea(r) (PI*r*r)int main() { float radius, area; printf("Enter the radius: "); scanf("%f", &radius); area = circleArea(radius); printf("Area = %.2f", area); return 0;}
Navštivte tuto stránku a dozvíte se více o makrech a preprocesoru #define.
Podmíněná kompilace
V programování v jazyce C můžete preprocesoru nařídit, zda má blok kódu zahrnout, nebo ne. K tomu lze použít podmíněné direktivy.
Je to podobné jako příkaz if
s jedním zásadním rozdílem.
Příkaz if
se testuje v průběhu provádění a kontroluje, zda se má blok kódu provést, nebo ne, zatímco podmíněné direktivy se používají k zařazení (nebo vynechání) bloku kódu do programu před jeho provedením.
Použití kondicionálu
- použít různý kód v závislosti na stroji, operačním systému
- kompilovat stejný zdrojový soubor ve dvou různých programech
- vyřadit určitý kód z programu, ale ponechat ho jako odkaz pro budoucí účely
Jak používat kondicionál?
K použití podmíněného se používají direktivy #ifdef
, #if
, #defined
, #else
a #elseif
.
#ifdef Směrnice
#ifdef MACRO // conditional codes#endif
Zde jsou podmíněné kódy zahrnuty do programu pouze v případě, že je definováno MACRO.
#if, #elif a #else Směrnice
#if expression // conditional codes#endif
Zde je výrazem výraz celočíselného typu (mohou to být celá čísla, znaky, aritmetický výraz, makra apod.).
Podmíněné kódy jsou do programu zahrnuty pouze v případě, že je výraz vyhodnocen na nenulovou hodnotu.
S direktivou #if
lze použít nepovinnou direktivu #else
.
#if expression conditional codes if expression is non-zero#else conditional if expression is 0#endif
Do #if...#else
můžete také přidat vnořenou podmínku pomocí #elif
#if expression // conditional codes if expression is non-zero#elif expression1 // conditional codes if expression is non-zero#elif expression2 // conditional codes if expression is non-zero#else // conditional if all expressions are 0#endif
#defined
Speciální operátor #defined slouží k testování, zda je určité makro definováno, nebo ne. Často se používá s direktivou #if.
#if defined BUFFER_SIZE && BUFFER_SIZE >= 2048 // codes
Předdefinovaná makra
Zde jsou uvedena některá předdefinovaná makra v programování v jazyce C.
Makro | Hodnota |
---|---|
__DATE__ |
Řetězec obsahující aktuální datum |
__FILE__ |
A. řetězec obsahující název souboru |
__LINE__ |
Celé číslo představující aktuální číslo řádku |
__STDC__ |
Pokud se řídí normou ANSI C, pak je hodnotou nenulové celé číslo |
__TIME__ |
Řetězec obsahující aktuální datum. |
Příklad 3: Získání aktuálního času pomocí __TIME__
Následující program vypíše aktuální čas pomocí makra __TIME__
.
#include <stdio.h>int main(){ printf("Current time: %s",__TIME__); }
Výstup
Current time: 19:54:39
Doporučené čtení
- Řízení řádků
- Pragmy
- Výstup z preprocesoru
- Další direktivy
.