logo

C predprocesory

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.

preprocesory v c



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:

  1. Makrá
  2. Zahrnutie súboru
  3. Podmienená kompilácia
  4. 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:

  1. #if Smernica
  2. #ifdef smernice
  3. #ifndef smernice
  4. #else Smernica
  5. #elif smernice
  6. #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ú:

  1. #undef smernice
  2. #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:

  1. #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()).
  2. #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.