Preprocesory jsou programy, které zpracovávají zdrojový kód před kompilací. Mezi napsáním programu a spuštěním programu v C je několik kroků. Podívejme se na tyto kroky, než se skutečně začneme učit o preprocesorech.

Mezikroky můžete vidět na výše uvedeném diagramu. Zdrojový kód napsaný programátory se nejprve uloží do souboru, nechť název je program.c . Tento soubor je poté zpracován preprocesory a je vygenerován rozšířený soubor zdrojového kódu s názvem program.i. Tento rozšířený soubor je kompilován kompilátorem a je vygenerován soubor objektového kódu s názvem program.obj. Nakonec linker propojí tento soubor objektového kódu s objektovým kódem funkcí knihovny a vygeneruje spustitelný soubor program.exe.
Směrnice preprocesoru v C
Preprocesorové programy poskytují direktivy preprocesoru, které říkají kompilátoru, aby předzpracoval zdrojový kód před kompilací. Všechny tyto direktivy preprocesoru začínají znakem „#“ (hash). Symbol „#“ označuje, že jakýkoli příkaz začínající znakem „#“ přejde do programu preprocesoru, aby byl proveden. Tyto direktivy preprocesoru můžeme umístit kamkoli v našem programu.
Příklady některých direktiv preprocesoru jsou: #zahrnout , #definovat , #ifndef, atd.
Poznámka Pamatujte, že # symbol poskytuje pouze cestu k preprocesoru a příkaz jako include je zpracován programem preprocesoru. Například #include zahrne kód nebo obsah zadaného souboru ve vašem programu.
Seznam direktiv preprocesoru v C
V následující tabulce jsou uvedeny všechny direktivy preprocesoru v jazyce C:
| Předprocesorové směrnice | Popis |
|---|---|
| #definovat | Používá se k definování makra |
| #undef | Používá se k zrušení definice makra |
| #zahrnout | Používá se k zahrnutí souboru do programu se zdrojovým kódem |
| #ifdef C | Používá se k zahrnutí části kódu, pokud je určité makro definováno pomocí #define |
| #ifndef | Používá se k zahrnutí části kódu, pokud určité makro není definováno pomocí #define |
| #li | Zkontrolujte specifikovaný stav |
| #jiný | Alternativní kód, který se spustí, když #if selže |
| #endif | Používá se k označení konce #if, #ifdef a #ifndef |
Tyto preprocesory lze klasifikovat podle typu funkce, kterou vykonávají.
Typy C preprocesorů
Existují 4 hlavní typy direktiv preprocesoru:
- Makra
- Začlenění souboru
- Podmíněná kompilace
- Další směrnice
Pojďme se nyní podrobně seznámit s každou z těchto směrnic.
1. Makra
V C jsou makra kusy kódu v programu, který má nějaké jméno. Kdykoli kompilátor narazí na tento název, nahradí toto jméno skutečným kusem kódu. The '#definovat' direktiva se používá k definování makra.
Syntaxe definice makra
#define token value>
kde po předběžném zpracování, žeton bude rozšířena na jeho hodnota v programu.
Příklad makra
C
// C Program to illustrate the macro> #include> // macro definition> #define LIMIT 5> int> main()> {> >for> (>int> i = 0; i printf('%d
', i); } return 0; }> |
>
>Výstup
0 1 2 3 4>
Ve výše uvedeném programu, když kompilátor provede slovo LIMIT, nahradí ho 5. Slovo 'OMEZIT' v definici makra se nazývá makro šablona a „5“ je makroexpanze.
Poznámka Na konci definice makra není středník (;). Definice maker nepotřebují k ukončení středník.
Jsou tam i nějaké Předdefinovaná makra v C které jsou užitečné při poskytování různých funkcí našemu programu.
Makra S Argumenty
Argumenty můžeme předávat i makrům. Makra definovaná s argumenty fungují podobně jako funkce.
Příklad
#define foo( a, b ) a + b #define func(r) r * r>
Pojďme to pochopit pomocí programu:
C
// C Program to illustrate function like macros> #include> // macro with parameter> #define AREA(l, b) (l * b)> int> main()> {> >int> l1 = 10, l2 = 5, area;> >area = AREA(l1, l2);> >printf>(>'Area of rectangle is: %d'>, area);> >return> 0;> }> |
>
>Výstup
Area of rectangle is: 50>
Z výše uvedeného programu vidíme, že kdykoli překladač najde v programu AREA(l, b), nahradí ji příkazem (l*b). Nejen to, ale hodnoty předané do šablony makra AREA(l, b) budou také nahrazeny v příkazu (l*b). AREA(10, 5) se tedy bude rovnat 10*5.
2. Začlenění souboru
Tento typ direktivy preprocesoru říká kompilátoru, aby zahrnul soubor do programu se zdrojovým kódem. The #include direktiva preprocesoru se používá k zahrnutí hlavičkových souborů do programu C.
Existují dva typy souborů, které může uživatel zahrnout do programu:
Standardní záhlaví souborů
Standardní hlavičkové soubory obsahují definice předdefinovaných funkcí, např printf(), scanf(), atd. Tyto soubory musí být zahrnuty pro práci s těmito funkcemi. Různé funkce jsou deklarovány v různých hlavičkových souborech.
Například standardní I/O funkce jsou v souboru „iostream“, zatímco funkce, které provádějí operace s řetězci, jsou v souboru „řetězec“.
Syntax
#include < file_name>>
kde název souboru je název hlavičkového souboru, který má být zahrnut. The '' závorky řekněte kompilátoru, aby hledal soubor v s standardní adresář.
Uživatelsky definované soubory záhlaví
Když se program stane velmi velkým, je dobré ho rozdělit na menší soubory a zahrnout je, kdykoli je to potřeba. Tyto typy souborů jsou uživatelem definované hlavičkové soubory.
Syntax
#include ' filename '>
The dvojité uvozovky ( ) řekněte kompilátoru, aby hledal soubor záhlaví v adresář zdrojového souboru.
3. Podmíněná kompilace
Podmíněná kompilace ve směrnicích C je typ direktivy, která pomáhá zkompilovat určitou část programu nebo přeskočit kompilaci některé konkrétní části programu na základě určitých podmínek. K vložení podmíněného kódu se používají následující direktivy preprocesoru:
- #if Směrnice
- #ifdef směrnice
- #ifndef směrnice
- #else Směrnice
- #elif směrnice
- #endif směrnice
#endif direktiva se používá k uzavření otevíracích direktiv #if, #ifdef a #ifndef, což znamená, že předzpracování těchto direktiv je dokončeno.
Syntax
#ifdef macro_name // Code to be executed if macro_name is defined # ifndef macro_name // Code to be executed if macro_name is not defined #if constant_expr // Code to be executed if constant_expression is true #elif another_constant_expr // Code to be excuted if another_constant_expression is true #else // Code to be excuted if none of the above conditions are true #endif>
Pokud makro s názvem „ název_makra ‘ je definován, pak se blok příkazů provede normálně, ale pokud není definován, kompilátor tento blok příkazů jednoduše přeskočí.
Příklad
Níže uvedený příklad ukazuje použití direktiv preprocesoru #include #if, #elif, #else a #endif.
C
//program to demonstrates the use of #if, #elif, #else,> // and #endif preprocessor directives.> #include> // defining PI> #define PI 3.14159> int> main()> {> > #ifdef PI> >printf>(>'PI is defined
'>);> > #elif defined(SQUARE)> >printf>(>'Square is defined
'>);> #else> >#error 'Neither PI nor SQUARE is defined'> #endif> > #ifndef SQUARE> >printf>(>'Square is not defined'>);> #else> >cout <<>'Square is defined'> << endl;> #endif> >return> 0;> }> |
>
>Výstup
PI is defined Square is not defined>
4. Další směrnice
Kromě výše uvedených směrnic existují ještě dvě směrnice, které se běžně nepoužívají. Tyto jsou:
- #undef směrnice
- Směrnice #pragma
1. Směrnice #undef
Direktiva #undef se používá k zrušení definice existujícího makra. Tato směrnice funguje takto:
#undef LIMIT>
Použití tohoto příkazu zruší definici stávajícího makra LIMIT. Po tomto příkazu bude každý příkaz #ifdef LIMIT vyhodnocen jako nepravdivý.
Příklad
Níže uvedený příklad ukazuje fungování směrnice #undef.
C
#include> // defining MIN_VALUE> #define MIN_VALUE 10> int> main() {> >// Undefining and redefining MIN_VALUE> printf>(>'Min value is: %d
'>,MIN_VALUE);> > //undefining max value> #undef MIN_VALUE> > // again redefining MIN_VALUE> #define MIN_VALUE 20> >printf>(>'Min value after undef and again redefining it: %d
'>, MIN_VALUE);> >return> 0;> }> |
>
>Výstup
Min value is: 10 Min value after undef and again redefining it: 20>
2. Směrnice #pragma
Tato direktiva je direktiva pro speciální účel a používá se k zapnutí nebo vypnutí některých funkcí. Tyto typy direktiv jsou specifické pro kompilátor, tj. liší se kompilátor od kompilátoru.
Syntax
#pragma directive>
Některé z direktiv #pragma jsou popsány níže:
- #pragma startup: Tyto direktivy nám pomáhají specifikovat funkce, které je potřeba spustit před spuštěním programu (než řízení přejde na main()).
- #pragma exit : Tyto direktivy nám pomáhají specifikovat funkce, které je potřeba spustit těsně před ukončením programu (těsně předtím, než se ovládací prvek vrátí z main()).
Níže uvedený program nebude pracovat s kompilátory GCC.
Příklad
Níže uvedený program ilustrují použití #pragma exit a pragma startup
C
// C program to illustrate the #pragma exit and pragma> // startup> #include> void> func1();> void> func2();> // specifying funct1 to execute at start> #pragma startup func1> // specifying funct2 to execute before end> #pragma exit func2> void> func1() {>printf>(>'Inside func1()
'>); }> void> func2() {>printf>(>'Inside func2()
'>); }> // driver code> int> main()> {> >void> func1();> >void> func2();> >printf>(>'Inside main()
'>);> >return> 0;> }> |
>
npm cache čistá
>
Očekávaný výstup
Inside func1() Inside main() Inside func2()>
Výše uvedený kód při spuštění na kompilátorech GCC vytvoří výstup, jak je uvedeno níže:
Inside main()c>
K tomu dochází, protože GCC nepodporuje spuštění nebo ukončení #pragma. Můžete však použít níže uvedený kód pro očekávaný výstup na kompilátorech GCC.
C
#include> void> func1();> void> func2();> void> __attribute__((constructor)) func1();> void> __attribute__((destructor)) func2();> void> func1()> {> >printf>(>'Inside func1()
'>);> }> void> func2()> {> >printf>(>'Inside func2()
'>);> }> int> main()> {> >printf>(>'Inside main()
'>);> >return> 0;> }> |
>
>Výstup
Inside func1() Inside main() Inside func2()>
Ve výše uvedeném programu jsme některé použili specifické syntaxe tak, že jedna z funkcí se provede před hlavní funkcí a druhá se provede po hlavní funkci.
#pragma varovat směrnice
Tato direktiva se používá ke skrytí varovné zprávy, která se zobrazuje během kompilace. Varování můžeme skrýt, jak je uvedeno níže:
- #pragma varovat -rvl : Tato direktiva skryje varování, která jsou vyvolána, když funkce, která má vracet hodnotu, nevrací hodnotu.
- #pragma varovat -par : Tato direktiva skryje varování, která se objeví, když funkce nepoužívá parametry, které jí byly předány.
- #pragma varovat -rch : Tato direktiva skryje varování, která se objeví, když je kód nedostupný. Například jakýkoli kód napsaný za vrátit se příkaz ve funkci je nedosažitelný.
Pokud se vám líbí techcodeview.com a chtěli byste přispět, můžete také napsat článek pomocí . Podívejte se, jak se váš článek objeví na hlavní stránce techcodeview.com a pomozte tak dalším geekům. Pokud najdete něco nesprávného nebo pokud chcete sdílet více informací o výše uvedeném tématu, napište prosím komentáře.