Ž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.
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>
#defineKONSTANTA1
intmain(void)
{
if(KONSTANTA ==1)
printf("KONSTANTA yra matoma!");// musu programa atspausdina sia eilute
else
printf("KONSTANTA nera matoma!");
return0;
}
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>
#defineSANDAUGA(a,b) ((a) * (b))
intmain(void)
{
printf( "%d", SANDAUGA(10, 5) );
return0;
}
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
#ifndefHEADER
#defineHEADER
intfunkcija(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?