Preprocesory sú programy, ktoré spracovávajú zdrojový kód pred kompiláciou. Medzi napísaním programu a vykonaním programu v C je zahrnutých niekoľko krokov. Pozrime sa na tieto kroky skôr, ako sa začneme učiť o preprocesoroch.

Medzikroky môžete vidieť vo vyššie uvedenom diagrame. Zdrojový kód napísaný programátormi sa najskôr uloží do súboru, nech je názov program.c . Tento súbor potom spracujú preprocesory a vygeneruje sa rozšírený súbor zdrojového kódu s názvom program.i. Tento rozšírený súbor skompiluje kompilátor a vygeneruje sa súbor s objektovým kódom s názvom program.obj. Nakoniec linker prepojí tento súbor objektového kódu s objektovým kódom knižničných funkcií, aby vygeneroval spustiteľný súbor program.exe.
Smernice o preprocesoroch v C
Preprocesorové programy poskytujú direktívy preprocesora, ktoré prikazujú kompilátoru predspracovať zdrojový kód pred kompiláciou. Všetky tieto príkazy preprocesora začínajú znakom „#“ (hash). Symbol „#“ označuje, že akýkoľvek príkaz začínajúci znakom „#“ prejde do programu preprocesora, aby sa vykonal. Tieto príkazy preprocesora môžeme umiestniť kdekoľvek v našom programe.
Príklady niektorých direktív preprocesora sú: #include , #definovať , #ifndef, atď.
Poznámka Pamätajte si, že # symbol poskytuje iba cestu k preprocesoru a príkaz ako include je spracovaný programom preprocesora. Napríklad #include zahrnie kód alebo obsah určeného súboru vo vašom programe.
Zoznam direktív preprocesora v C
Nasledujúca tabuľka uvádza všetky direktívy preprocesora v jazyku C:
| Predprocesorové smernice | Popis |
|---|---|
| #definovať | Používa sa na definovanie makra |
| #undef | Používa sa na zrušenie definície makra |
| #include | Používa sa na zahrnutie súboru do programu so zdrojovým kódom |
| #ifdef | Používa sa na zahrnutie časti kódu, ak je určité makro definované pomocou #define |
| #ifndef | Používa sa na zahrnutie časti kódu, ak určité makro nie je definované pomocou #define |
| #ak | Skontrolujte špecifikovaný stav |
| #else | Alternatívny kód, ktorý sa spustí, keď #if zlyhá |
| #koniec Ak | Používa sa na označenie konca #if, #ifdef a #ifndef |
Tieto preprocesory možno klasifikovať na základe typu funkcie, ktorú vykonávajú.
Typy C preprocesorov
Existujú 4 hlavné typy predprocesorových direktív:
- Makrá
- Zahrnutie súboru
- Podmienená kompilácia
- Iné smernice
Dozvieme sa teraz podrobne o každej z týchto smerníc.
previesť int na reťazec
1. Makrá
V jazyku C sú makrá kúsky kódu v programe, ktorý má nejaké meno. Vždy, keď kompilátor narazí na tento názov, kompilátor nahradí názov skutočným kúskom kódu. The „#define“ Direktíva sa používa na definovanie makra.
Syntax definície makra
#define token value>
kde po predspracovaní sa žetón sa rozšíri na jeho hodnotu v programe.
Prí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ýkon
0 1 2 3 4>
Vo vyššie uvedenom programe, keď kompilátor vykoná slovo LIMIT, nahradí ho slovom 5. Slovo „LIMIT“ v definícii makra sa nazýva šablóna makra a „5“ je makro expanzia.
Poznámka Na konci definície makra nie je bodkočiarka (;). Makro definície nepotrebujú na koniec bodkočiarku.
Nájdu sa aj nejaké Preddefinované makrá v C ktoré sú užitočné pri poskytovaní rôznych funkcií nášmu programu.
Makrá s argumentmi
Argumenty môžeme odovzdať aj makrám. Makrá definované s argumentmi fungujú podobne ako funkcie.
Príklad
#define foo( a, b ) a + b #define func(r) r * r>
Pochopme to pomocou 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ýkon
Area of rectangle is: 50>
Z vyššie uvedeného programu vidíme, že vždy, keď kompilátor nájde v programe AREA(l, b), nahradí ju príkazom (l*b). Nielen to, ale hodnoty odovzdané do šablóny makra AREA(l, b) budú tiež nahradené v príkaze (l*b). Preto sa AREA(10, 5) bude rovnať 10*5.
2. Začlenenie súboru
Tento typ direktívy preprocesora hovorí kompilátoru, aby zahrnul súbor do programu zdrojového kódu. The #include direktíva preprocesora sa používa na zahrnutie hlavičkových súborov do programu C.
Existujú dva typy súborov, ktoré môže používateľ zahrnúť do programu:
Štandardné hlavičkové súbory
Štandardné hlavičkové súbory obsahujú definície preddefinovaných funkcií ako napr printf(), scanf(), atď. Tieto súbory musia byť zahrnuté, aby mohli pracovať s týmito funkciami. Rôzne funkcie sú deklarované v rôznych hlavičkových súboroch.
Napríklad štandardné I/O funkcie sú v súbore „iostream“, zatiaľ čo funkcie, ktoré vykonávajú reťazcové operácie, sú v súbore „reťazec“.
Syntax
#include < file_name>>
kde názov súboru je názov súboru hlavičky, ktorý sa má zahrnúť. The „“ zátvorky povedzte kompilátoru, aby vyhľadal súbor v s štandardný adresár.
Používateľom definované hlavičkové súbory
Keď sa program veľmi zväčší, je dobrým zvykom rozdeliť ho na menšie súbory a zahrnúť ich vždy, keď je to potrebné. Tieto typy súborov sú užívateľom definované hlavičkové súbory.
Syntax
#include ' filename '>
The dvojité úvodzovky ( ) povedzte kompilátoru, aby vyhľadal hlavičkový súbor v adresár zdrojového súboru.
tostring java
3. Podmienená kompilácia
Podmienená kompilácia v smerniciach C je typ príkazu, ktorý pomáha skompilovať určitú časť programu alebo preskočiť kompiláciu určitej časti programu na základe určitých podmienok. Na vloženie podmieneného kódu sa používajú nasledujúce direktívy preprocesora:
- #if Smernica
- #ifdef smernice
- #ifndef smernice
- #else Smernica
- #elif smernice
- #endif smernice
#koniec Ak Direktíva sa používa na uzavretie otváracích direktív #if, #ifdef a #ifndef, čo znamená, že predbežné spracovanie týchto direktív je dokončené.
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>
Ak makro s názvom „ názov_makra ‘ je definovaný, potom sa blok príkazov vykoná normálne, ale ak nie je definovaný, kompilátor jednoducho preskočí tento blok príkazov.
Príklad
Nasledujúci príklad demonštruje použitie direktív preprocesora #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ýkon
PI is defined Square is not defined>
4. Iné smernice
Okrem vyššie uvedených smerníc existujú ešte dve smernice, ktoré sa bežne nepoužívajú. Toto sú:
- #undef smernice
- #pragma smernice
1. #undef Smernica
Direktíva #undef sa používa na zrušenie definície existujúceho makra. Táto smernica funguje takto:
#undef LIMIT>
Použitím tohto príkazu zrušíte definíciu existujúceho makra LIMIT. Po tomto príkaze bude každý príkaz #ifdef LIMIT vyhodnotený ako nepravdivý.
Príklad
Nasledujúci príklad demonštruje fungovanie smernice #undef.
C
python znížiť
#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ýkon
Min value is: 10 Min value after undef and again redefining it: 20>
2. Smernica #pragma
Táto direktíva je direktíva na špeciálny účel a používa sa na zapnutie alebo vypnutie niektorých funkcií. Tieto typy direktív sú špecifické pre kompilátor, t.j. líšia sa od kompilátora k kompilátoru.
Syntax
#pragma directive>
Niektoré zo smerníc #pragma sú popísané nižšie:
- #pragma startup: Tieto direktívy nám pomáhajú špecifikovať funkcie, ktoré je potrebné spustiť pred spustením programu (predtým, ako riadenie prejde na main()).
- #pragma exit : Tieto direktívy nám pomáhajú špecifikovať funkcie, ktoré sú potrebné na spustenie tesne pred ukončením programu (tesne predtým, ako sa ovládací prvok vráti z main()).
Nižšie uvedený program nebude fungovať s kompilátormi GCC.
Príklad
Nižšie uvedený program ilustrujú použitie #pragma exit a pragma startup
C
enkapsulačný program
// 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;> }> |
>
>
Očakávaný výstup
Inside func1() Inside main() Inside func2()>
Vyššie uvedený kód vytvorí výstup, ako je uvedené nižšie, keď sa spustí na kompilátoroch GCC:
Inside main()c>
Stáva sa to preto, že GCC nepodporuje spustenie alebo ukončenie #pragma. Môžete však použiť nižšie uvedený kód pre očakávaný výstup na kompilátoroch 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ýkon
Inside func1() Inside main() Inside func2()>
Vo vyššie uvedenom programe sme použili niektoré špecifické syntaxe tak, že jedna z funkcií sa vykoná pred hlavnou funkciou a druhá sa vykoná po hlavnej funkcii.
Smernica #pragma varovať
Táto direktíva sa používa na skrytie varovnej správy, ktorá sa zobrazuje počas kompilácie. Varovania môžeme skryť, ako je uvedené nižšie:
- #pragma varovať -rvl : Táto direktíva skryje varovania, ktoré sa objavia, keď funkcia, ktorá má vrátiť hodnotu, nevráti hodnotu.
- #pragma varovať -par : Táto direktíva skryje tie varovania, ktoré sa objavia, keď funkcia nepoužíva parametre, ktoré jej boli odovzdané.
- #pragma varovať -rch : Táto smernica skryje varovania, ktoré sa objavia, keď je kód nedostupný. Napríklad akýkoľvek kód napísaný za vrátiť príkaz vo funkcii je nedostupný.
Ak sa vám páči techcodeview.com a chceli by ste prispieť, môžete tiež napísať článok pomocou . Pozrite si, ako sa váš článok objaví na hlavnej stránke techcodeview.com a pomôžte tak ostatným geekom. Napíšte komentáre, ak nájdete niečo nesprávne, alebo ak chcete zdieľať viac informácií o téme diskutovanej vyššie.