Predprocesorji so programi, ki obdelajo izvorno kodo pred prevajanjem. Med pisanjem programa in izvajanjem programa v C je vključenih več korakov. Oglejmo si te korake, preden se dejansko začnemo učiti o predprocesorjih.

V zgornjem diagramu si lahko ogledate vmesne korake. Izvorna koda, ki jo napišejo programerji, se najprej shrani v datoteko, naj bo ime program.c . To datoteko nato obdelajo predprocesorji in generira se razširjena datoteka izvorne kode z imenom program.i. To razširjeno datoteko prevede prevajalnik in generira se datoteka objektne kode z imenom program.obj. Nazadnje povezovalnik poveže to datoteko objektne kode z objektno kodo funkcij knjižnice, da ustvari izvršljivo datoteko program.exe.
Direktive predprocesorja v C
Predprocesorski programi zagotavljajo predprocesorske direktive, ki povejo prevajalniku, naj predhodno obdela izvorno kodo pred prevajanjem. Vse te direktive predprocesorja se začnejo s simbolom '#' (hash). Simbol '#' označuje, da bo kateri koli stavek, ki se začne z '#', šel v izvedbo v predprocesorski program. Te direktive predprocesorja lahko postavimo kamor koli v naš program.
Primeri nekaterih direktiv predprocesorja so: #vključi , #definiraj , #ifndef, itd.
Opomba Ne pozabite, da je # simbol zagotavlja samo pot do predprocesorja, ukaz, kot je include, pa obdela program predprocesorja. Na primer, #include bo v vaš program vključila kodo ali vsebino navedene datoteke.
Seznam direktiv predprocesorja v C
Naslednja tabela navaja vse direktive predprocesorja v C:
| Direktive za predprocesor | Opis |
|---|---|
| #definiraj | Uporablja se za definiranje makra |
| #undef | Uporablja se za razveljavitev definicije makra |
| #vključi | Uporablja se za vključitev datoteke v program izvorne kode |
| #ifdef | Uporablja se za vključitev dela kode, če je določen makro definiran z #define |
| #ifndef | Uporablja se za vključitev dela kode, če določen makro ni definiran z #define |
| #če | Preverite navedeni pogoj |
| #drugo | Nadomestna koda, ki se izvede, ko #if ne uspe |
| #endif | Uporablja se za označevanje konca #if, #ifdef in #ifndef |
Te predprocesorje je mogoče razvrstiti glede na vrsto funkcije, ki jo opravljajo.
Vrste predprocesorjev C
Obstajajo 4 glavne vrste direktiv predprocesorja:
- Makri
- Vključitev datoteke
- Pogojna kompilacija
- Druge direktive
Zdaj pa se podrobneje seznanimo z vsako od teh direktiv.
1. Makri
V jeziku C so makri deli kode v programu, ki mu je dano neko ime. Kadarkoli prevajalnik naleti na to ime, ga nadomesti z dejanskim delom kode. The '#define' se uporablja za definiranje makra.
Sintaksa definicije makra
#define token value>
kjer se po predhodni obdelavi žeton bodo razširili na svoje vrednost v programu.
Primer makra
C
mylivecricket
// C Program to illustrate the macro> #include> // macro definition> #define LIMIT 5> int> main()> {> >for> (>int> i = 0; i printf('%d
', i); } return 0; }> |
>
>Izhod
0 1 2 3 4>
V zgornjem programu, ko prevajalnik izvede besedo LIMIT, jo nadomesti s 5. Beseda ‘LIMIT’ v definiciji makra se imenuje predloga makra in '5' je makro razširitev.
Opomba Na koncu definicije makra ni podpičja (;). Makro definicije ne potrebujejo podpičja na koncu.
Nekaj jih je tudi Vnaprej določeni makri v C ki so uporabni pri zagotavljanju različnih funkcionalnosti našega programa.
Makri z argumenti
Argumente lahko posredujemo tudi makrom. Makri, definirani z argumenti, delujejo podobno kot funkcije.
Primer
#define foo( a, b ) a + b #define func(r) r * r>
Naj to razumemo s programom:
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;> }> |
>
>Izhod
Area of rectangle is: 50>
Iz zgornjega programa lahko vidimo, da kadarkoli prevajalnik najde AREA(l, b) v programu, ga nadomesti s stavkom (l*b). Ne le to, v stavku (l*b) bodo zamenjane tudi vrednosti, posredovane predlogi makra AREA(l, b). Zato bo AREA(10, 5) enako 10*5.
2. Vključitev datoteke
Ta vrsta direktive predprocesorja pove prevajalniku, naj vključi datoteko v program izvorne kode. The #include direktiva predprocesorja se uporablja za vključitev datotek glave v program C.
Obstajata dve vrsti datotek, ki jih lahko uporabnik vključi v program:
Standardne datoteke glave
Standardne datoteke glave vsebujejo definicije vnaprej določenih funkcij, kot je printf(), scanf(), itd. Te datoteke morajo biti vključene za delo s temi funkcijami. Različne funkcije so deklarirane v različnih datotekah glave.
Standardne V/I funkcije so na primer v datoteki »iostream«, medtem ko so funkcije, ki izvajajo nizovne operacije, v datoteki »niz«.
Sintaksa
#include < file_name>>
kje Ime datoteke je ime datoteke glave, ki bo vključena. The '' oklepaji recite prevajalniku, naj poišče datoteko v s standardni imenik.
Uporabniško določene datoteke glave
Ko program postane zelo velik, je dobro, da ga razdelite na manjše datoteke in jih vključite, kadar koli je to potrebno. Te vrste datotek so uporabniško določene datoteke glave.
Sintaksa
#include ' filename '>
The dvojni narekovaji ( ) recite prevajalniku, naj poišče datoteko glave v imenik izvorne datoteke.
3. Pogojna kompilacija
Pogojno prevajanje v direktivah C je vrsta direktive, ki pomaga prevesti določen del programa ali preskočiti prevajanje določenega dela programa na podlagi nekaterih pogojev. Obstajajo naslednje direktive predprocesorja, ki se uporabljajo za vstavljanje pogojne kode:
- Direktiva #if
- Direktiva #ifdef
- Direktiva #ifndef
- Direktiva #else
- Direktiva #elif
- Direktiva #endif
#endif se uporablja za zapiranje začetnih direktiv #if, #ifdef in #ifndef, kar pomeni, da je predhodna obdelava teh direktiv končana.
Sintaksa
#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>
Če je makro z imenom ' ime_makra ‘ definiran, se bo blok stavkov izvedel normalno, če pa ni definiran, bo prevajalnik preprosto preskočil ta blok stavkov.
Primer
Spodnji primer prikazuje uporabo predprocesorskih direktiv #include #if, #elif, #else in #endif.
C
'abc's v številkah'
//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;> }> |
>
>Izhod
PI is defined Square is not defined>
4. Druge direktive
Poleg zgornjih direktiv obstajata še dve direktivi, ki se pogosto ne uporabljata. To so:
- Direktiva #undef
- Direktiva #pragma
1. Direktiva #undef
Direktiva #undef se uporablja za razveljavitev definicije obstoječega makra. Ta direktiva deluje kot:
#undef LIMIT>
Uporaba tega stavka bo razveljavila definicijo obstoječega makra LIMIT. Po tem stavku bo vsak stavek #ifdef LIMIT ocenjen kot false.
Primer
Spodnji primer prikazuje delovanje direktive #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;> }> |
>
>Izhod
Min value is: 10 Min value after undef and again redefining it: 20>
2. Direktiva #pragma
Ta direktiva je direktiva za posebne namene in se uporablja za vklop ali izklop nekaterih funkcij. Te vrste direktiv so specifične za prevajalnik, tj. razlikujejo se od prevajalnika do prevajalnika.
Sintaksa
#pragma directive>
Nekatere direktive #pragma so obravnavane spodaj:
- #pragma zagon: Te direktive nam pomagajo določiti funkcije, ki se morajo izvajati pred zagonom programa (preden nadzor preide na main()).
- #pragma izhod : Te direktive nam pomagajo določiti funkcije, ki se morajo izvajati tik pred izhodom iz programa (tik preden se krmilnik vrne iz main()).
Spodnji program ne bo deloval s prevajalniki GCC.
Primer
Spodnji program ponazarjajo uporabo #pragma exit in pragma startup
C
markdown slika
// 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;> }> |
>
>
Pričakovani rezultat
Inside func1() Inside main() Inside func2()>
Zgornja koda bo pri izvajanju v prevajalnikih GCC ustvarila izhod, kot je podan spodaj:
Inside main()c>
To se zgodi, ker GCC ne podpira #pragma zagona ali izhoda. Vendar pa lahko uporabite spodnjo kodo za pričakovan rezultat na prevajalnikih 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;> }> |
>
>Izhod
Inside func1() Inside main() Inside func2()>
V zgornjem programu smo jih uporabili nekaj posebne sintakse tako da se ena od funkcij izvede pred glavno funkcijo, druga pa za glavno funkcijo.
Direktiva #pragma warn
Ta direktiva se uporablja za skrivanje opozorilnega sporočila, ki se prikaže med prevajanjem. Opozorila lahko skrijemo, kot je prikazano spodaj:
- #pragma opozorilo -rvl : Ta direktiva skrije tista opozorila, ki se prikažejo, ko funkcija, ki naj bi vrnila vrednost, ne vrne vrednosti.
- #pragma opozorilo -par : Ta direktiva skrije tista opozorila, ki se prikažejo, ko funkcija ne uporablja parametrov, ki so ji bili posredovani.
- #pragma opozorilo -rch : Ta direktiva skrije tista opozorila, ki se prikažejo, ko je koda nedosegljiva. Na primer, katera koli koda, napisana za vrnitev stavek v funkciji je nedosegljiv.
Če vam je všeč techcodeview.com in bi radi prispevali, lahko članek napišete tudi z uporabo . Oglejte si, da se vaš članek pojavi na glavni strani techcodeview.com in pomagajte drugim Geekom. Prosimo, napišite komentarje, če najdete karkoli napačnega ali če želite deliti več informacij o zgoraj obravnavani temi.