Nurodymai preprocesoriui C kalboje

Skaitymo trukmė: 4 minutės

Žinojimas kaip teisingai perduoti nurodymus preprocesoriui padeda ne vienam C programuotojui rašyti optimalesnes programas. Prieš pasinerdami į konkrečius nurodymus preprocesoriui (angl. preprocessor directives ), galime trumpai susipažinti su pačiu preprocesoriumi.

Preprocesorius yra programa, kuri apdoroja mūsų parašytą C kodą pirmiau nei tai daro kompiliatorius. Šio proceso metu, preprocesorius išskirtinai ieško konkrečių nurodymų, kuriuos apžvelgsime žemiau, ir vykdo juose rastas instrukcijas. Tik po to, kai preprocesorius baigia modifikuoti kodą pagal preprocesoriaus nurodymų instrukcijas, tolimesnis informacijos apdorojimas ar kompiliavimas yra perduodamas kompiliatoriui.

Šiame straipsnyje apžvelgsime žemiau išvardintas preprocesoriaus nurodymų grupes.

1. Apibrėžimo nurodymai: #define and #undef

Apibrėžimo nurodymai, ar konkrečiau, #define ir #undef yra intrukcijos preprocesoriui.

Naudinga žinoti: visi preprocesoriaus nurodymai yra rašomi su simboliu # pradžioje.

Su preprocesoriaus nurodymu #define mes galime nustatyti nekintančią reikšmę. Žemiau galite matyti, kaip šitai atrodo C programavimo kalboje.

Pavyzdys 1: preprocesoriaus nurodymas #define

# include <stdio.h>
# define KONSTANTA 1

int main ( void )
{
    
if (KONSTANTA == 1 )
        
printf ("KONSTANTA yra matoma!"); // musu programa atspausdina sia eilute
    
else
        
printf ("KONSTANTA nera matoma!");
    
return 0 ;
}

Galimas rezultatas:

KONSTANTA yra matoma

Iš C kalbos kodo fragmento viršuje galima spręsti, jog su #define nurodymu nustatytos reikšmės yra matomos programos vykdymo metu. Tačiau, šios reikšmės yra nustatomos tik vieną kartą, o jų keisti mes negalime.

Tai ką nustatėme su #define instrukcija pirmame pavyzdyje yra reikšmė. Visgi su šiuo preprocesoriaus nurodymu mes galime nustatyti ne tik reikšmes, bet ir išraiškas. Tam, jog geriau tai suprastumėte, pažvelkite į antrą pavyzdį.

Pavyzdys 2: #define nurodymu nustatyta išraiška

# include <stdio.h>
# define SANDAUGA(a,b) ((a) * (b))

int main ( void )
{
    
printf ( "%d", SANDAUGA(10, 5) );
    
return 0 ;
}

Galimas rezultatas:

50

Kitas apibrėžimo nurodymas, kurį aptarsime yra #undef. Šis preprocesoriaus nurodymas turi savotiškai priešingą reikšmę #define nurodymui. Ar tiksliau tariant, #undef pašalina nustatytą reikšmę, o vėliau vykdomoje programoje nebegalima naudotis iki tol legaliomis reikšmėmis.

Pamėginkite įsistatyti žemiau esančias eilutes į pirmą arba antrą kodo pavyzdį.

#undef SANDAUGA
#undef KONSTANTA

2. Turinio įtraukimo nurodymai: #include

Preprocesoriaus nurodymą #include galime atrasti daugelyje C kalba parašytų programų. Kadangi rašydami šį nurodymą, mes duodame instrukciją preprocesoriui, jog šis nurodymas būtų pakeistas detalizuotoje bibliotekoje esančiu kodu. Taigi, jeigu rašome #include <stdio.h> savo programoje, tada kompiliavimo metu visas turinys esantis <stdio.h> bibliotekoje atsiduria mūsų programoje ir tokiu būdu mūsų programoje gali būti naudojamos šioje bibliotekoje esančios funkcijos.

Jeigu mes nurodome antraštės pavadinimą (pvz. stdio.h) tarp rodyklių (<>), tada mes duodame instrukciją detalizuoto dokumento ieškoti standartinėje C kalbos bibliotekoje. Jeigu, kita vertus, mes antraštės pavadinimą nurodome tarp kabučių (#include "naujas_header.h"), tada pirmiausiai yra ieškoma mūsų nurodytose dokumentų vietose.

3. Sąlyginio kompiliavimo nurodymai: #ifndef, #ifdef and #endif

Tiek nurodymas #ifdef, tiek ir #ifndef turi būti uždarytas su preprocesoriaus nurodymu #endif. Nurodymas #ifndef dažnai yra naudojamas kaip antraščių apsauga nuo dvigubo apibrėžimo. Žemiau galite matyto šios preprocesoriaus naudojimo pavyzdį.

Pavyzdys 3: #ifndef naudojimas

# ifndef HEADER
# define HEADER
int funkcija( void );
# endif

Šiame kodo gabalėlyje mes tikriname ar reikšmė HEADER nėra apibrėžta. Tokiu atveju mes apibrežiame HEADER ir kitos reikšmės (funkcija) yra įtraukiamos į programą. O jeigu kompiliavimo metu dar syki sutinkamas teiginys #ifndef HEADER, tada informacija esanti tarp #ifndef ir #endif nebėra pakartotinai įtraukiama. Tokiu būdu mes optimizuojame savo programos dalį.

Kitas sąlyginio kompiliavimo nurodymas - #ifdef yra gana panašus į #ifndef. Skirtumas slypi tame, jog pirmasis nurodymas leidžia įtraukti kodą į programą, esantį tarp #ifdef ir #endif tuo atveju, jeigu tikrinama reikšmė jau yra apibrėžta su #define.

4. Intrukcijų dokumentams nurodymai: #pragma

Preprocesoriaus nurodymas #pragma yra dažnai sutinkamas didelėse programose. Su šiuo nurodymu mes galime rašyti instrukcijas vienai ar kitai operacinei sistemai. Daugelio operacinių sistemų palaikoma instrukcija yra once.

Su #pragma once instrukcija, kurią dažniausia rašome dokumento viršuje, mes apsisaugome nuo dvigubo kompiliavimo. Kas, kaip galite nuspėti, reikalauja laiko, kurį programuotojai verčiau taupo. Su #pragma once dažnai galime pakeisti #ifdef ir #endif blokus ir gauti tą patį rezultatą.

5. Žinių patikrinimas

Nurodymai preprocesoriui C programavimo kalboje

1Kokiu tikslu galime naudoti #pragme once?

2Kuris preprocesoriaus nurodymas yra teisingas, jeigu reikšmė nėra apibrėžta?

3Jeigu mes rašome #include "stdio.h", tada

Žinių patikrinimas baigtas!

Sveikiname!

Pasidalinkite savo geru rezultatu!