Išankstiniai procesoriai yra programos, kurios apdoroja šaltinio kodą prieš kompiliavimą. Nuo programos rašymo iki programos vykdymo C kalba reikia kelių žingsnių. Pažvelkime į šiuos veiksmus prieš pradėdami mokytis apie pirminius procesorius.

Aukščiau pateiktoje diagramoje galite pamatyti tarpinius veiksmus. Programuotojų parašytas šaltinio kodas pirmiausia išsaugomas faile, tebūnie pavadinimas programa.c . Tada šį failą apdoroja išankstiniai procesoriai ir sugeneruojamas išplėstinis šaltinio kodo failas pavadinimu program.i. Šį išplėstinį failą sukompiliuoja kompiliatorius ir sugeneruojamas objekto kodo failas, pavadintas program.obj. Galiausiai, nuoroda susieja šį objekto kodo failą su bibliotekos funkcijų objekto kodu, kad sugeneruotų vykdomąjį failą program.exe.
Pirminio apdorojimo direktyvos C
Išankstinio procesoriaus programos pateikia pirminio procesoriaus direktyvas, kurios nurodo kompiliatoriui iš anksto apdoroti šaltinio kodą prieš kompiliuojant. Visos šios pirminio procesoriaus direktyvos prasideda simboliu „#“ (maišos). Simbolis „#“ rodo, kad bet koks teiginys, prasidedantis raide „#“, pateks į išankstinio procesoriaus programą, kad būtų vykdomas. Šias pirminio procesoriaus direktyvas galime įdėti bet kurioje programos vietoje.
Kai kurių pirminio procesoriaus direktyvų pavyzdžiai: #įtraukti , #apibrėžti , #ifndef, ir tt
Pastaba Atminkite, kad # simbolis pateikia tik kelią į pirminį procesorių, o komandą, pvz., įtraukti, apdoroja išankstinio procesoriaus programa. Pavyzdžiui, #include įtrauks nurodyto failo kodą arba turinį į jūsų programą.
Pirminio procesoriaus direktyvų sąrašas C
Šioje lentelėje išvardytos visos C pirminio procesoriaus direktyvos:
| Pirminio apdorojimo direktyvos | apibūdinimas |
|---|---|
| #apibrėžti | Naudojamas makrokomandai apibrėžti |
| #undef | Naudojamas makrokomandos apibrėžimui panaikinti |
| #įtraukti | Naudojamas norint įtraukti failą į šaltinio kodo programą |
| #ifdef | Naudojama kodo skyriui įtraukti, jei tam tikra makrokomanda apibrėžta #define |
| #ifndef | Naudojama kodo skyriui įtraukti, jei tam tikra makrokomanda neapibrėžta #define |
| #jei | Patikrinkite nurodytą būklę |
| #Kitas | Alternatyvus kodas, kuris vykdomas, kai #if nepavyksta |
| #endif | Naudojamas #if, #ifdef ir #ifndef pabaigai pažymėti |
Šie pirminiai procesoriai gali būti klasifikuojami pagal jų atliekamų funkcijų tipą.
C pirminių procesorių tipai
Yra 4 pagrindiniai pirminio apdorojimo direktyvų tipai:
- Makrokomandos
- Failo įtraukimas
- Sąlyginis kompiliavimas
- Kitos direktyvos
Leiskite mums dabar išsamiai sužinoti apie kiekvieną iš šių direktyvų.
1. Makrokomandos
C kalboje makrokomandos yra programos, kuriai suteiktas tam tikras pavadinimas, kodo dalys. Kai kompiliatorius aptinka šį pavadinimą, jis pakeičia pavadinimą tikruoju kodo dalimi. The „#apibrėžti“ direktyva naudojama makrokomandai apibrėžti.
Makrokomandos apibrėžimo sintaksė
#define token value>
kur po išankstinio apdorojimo žetonas bus išplėsta iki jos vertė programoje.
Makrokomandos pavyzdys
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; }> |
>
>Išvestis
0 1 2 3 4>
Aukščiau pateiktoje programoje, kai kompiliatorius vykdo žodį LIMIT, jis pakeičia jį 5. Žodis „LIMIT“ makrokomandos apibrėžime vadinamas makrokomandos šablonu ir „5“ yra makro išplėtimas.
Pastaba Makrokomandos apibrėžimo pabaigoje nėra kabliataškio (;). Makrokomandų apibrėžimams užbaigti nereikia kabliataškio.
Yra ir tokių Iš anksto nustatytos makrokomandos C kurios yra naudingos teikiant įvairias mūsų programos funkcijas.
Makrokomandos su argumentais
Argumentus galime perduoti ir makrokomandoms. Argumentais apibrėžtos makrokomandos veikia panašiai kaip funkcijos.
Pavyzdys
#define foo( a, b ) a + b #define func(r) r * r>
Supraskime tai naudodami programą:
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;> }> |
>
>Išvestis
Area of rectangle is: 50>
Iš aukščiau pateiktos programos matome, kad kai tik kompiliatorius programoje randa AREA(l, b), jis jį pakeičia teiginiu (l*b). Ne tik tai, bet ir makrokomandos šablonui perduotos reikšmės AREA(l, b) taip pat bus pakeistos sakinyje (l*b). Todėl AREA(10, 5) bus lygus 10*5.
2. Failo įtraukimas
Šio tipo išankstinio procesoriaus direktyva nurodo kompiliatoriui įtraukti failą į šaltinio kodo programą. The #įtraukti pirminio procesoriaus direktyvą naudojamas įtraukti antraštės failus į C programą.
Yra dviejų tipų failai, kuriuos vartotojas gali įtraukti į programą:
Standartiniai antraštės failai
Standartiniuose antraštės failuose yra iš anksto nustatytų funkcijų, pvz., apibrėžimų printf (), scanf (), tt Šie failai turi būti įtraukti, kad veiktų su šiomis funkcijomis. Skirtinguose antraščių failuose deklaruojamos skirtingos funkcijos.
Pavyzdžiui, standartinės įvesties / išvesties funkcijos yra „iostream“ faile, o funkcijos, kurios atlieka eilutės operacijas, yra „eilutės“ faile.
Sintaksė
#include < file_name>>>kur failo pavadinimas yra įtraukiamo antraštės failo pavadinimas. The ‘’ skliausteliuose liepkite kompiliatoriui ieškoti failo s standartinis katalogas.
Vartotojo nustatyti antraštės failai
Kai programa tampa labai didelė, geriausia ją padalyti į mažesnius failus ir įtraukti juos, kai reikia. Šio tipo failai yra vartotojo apibrėžti antraštės failai.
Sintaksė
java rūšiavimo masyvų sąrašas
The dvigubos kabutės ( ) nurodykite kompiliatoriui ieškoti antraštės failo šaltinio failo katalogą.
3. Sąlyginis kompiliavimas
Sąlyginis kompiliavimas C direktyvose yra direktyva, kuri padeda sudaryti konkrečią programos dalį arba praleisti tam tikros konkrečios programos dalies kompiliavimą, atsižvelgiant į tam tikras sąlygas. Yra šios išankstinio procesoriaus direktyvos, kurios naudojamos sąlyginiam kodui įterpti:
- #if direktyva
- #ifdef direktyva
- #ifndef direktyva
- #kita direktyva
- #elif direktyva
- #endif direktyva
#endif direktyva naudojama uždarant #if, #ifdef ir #ifndef atidarymo direktyvas, o tai reiškia, kad išankstinis šių direktyvų apdorojimas baigtas.
Sintaksė
#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>
Jei makrokomanda pavadinimu „ makro_pavadinimas ' yra apibrėžtas, tada teiginių blokas bus vykdomas įprastai, tačiau jei jis nėra apibrėžtas, kompiliatorius tiesiog praleis šį teiginių bloką.
Pavyzdys
Toliau pateiktame pavyzdyje parodytas pirminio procesoriaus direktyvų #include #if, #elif, #else ir #endif naudojimas.
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;> }> |
>
mylintis kriketas
>Išvestis
PI is defined Square is not defined>
4. Kitos direktyvos
Be minėtų direktyvų, yra dar dvi direktyvos, kurios nėra įprastai naudojamos. Šitie yra:
- #undef direktyva
- #pragma direktyva
1. #undef direktyva
#undef direktyva naudojama esamos makrokomandos apibrėžimui panaikinti. Ši direktyva veikia taip:
#undef LIMIT>
Naudojant šį teiginį bus panaikinta esamos makrokomandos apibrėžtis LIMIT. Po šio teiginio kiekvienas #ifdef LIMIT teiginys bus įvertintas kaip klaidingas.
Pavyzdys
Toliau pateiktame pavyzdyje parodytas #undef direktyvos veikimas.
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;> }> |
>
>Išvestis
Min value is: 10 Min value after undef and again redefining it: 20>
2. #pragma direktyva
Ši direktyva yra specialios paskirties direktyva ir naudojama kai kurioms funkcijoms įjungti arba išjungti. Šio tipo direktyvos yra būdingos kompiliatoriams, t. y. jos skiriasi nuo kompiliatoriaus iki kompiliatoriaus.
Sintaksė
#pragma directive>
Kai kurios #pragma direktyvos yra aptariamos toliau:
- #pragma paleidimas: Šios direktyvos padeda mums nurodyti funkcijas, kurias reikia vykdyti prieš paleidžiant programą (prieš valdikliui pereinant į main()).
- #pragma išeiti : Šios direktyvos padeda mums nurodyti funkcijas, kurias reikia vykdyti prieš pat programos išėjimą (prieš pat valdikliui grįžtant iš main()).
Žemiau pateikta programa neveiks su GCC kompiliatoriais.
Pavyzdys
Žemiau pateikta programa iliustruoja #pragma exit ir pragma startup naudojimą
C
// 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;> }> |
>
>
Numatoma išvestis
Inside func1() Inside main() Inside func2()>
Pirmiau pateiktas kodas sukurs išvestį, kaip nurodyta toliau, kai bus paleista GCC kompiliatoriuose:
Inside main()c>
Taip nutinka todėl, kad GCC nepalaiko #pragma paleidimo ar išėjimo. Tačiau galite naudoti toliau pateiktą kodą numatomai GCC kompiliatorių produkcijai.
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;> }> |
>
>Išvestis
Inside func1() Inside main() Inside func2()>
Aukščiau pateiktoje programoje mes panaudojome kai kuriuos specifinės sintaksės kad viena iš funkcijų būtų vykdoma prieš pagrindinę funkciją, o kita – po pagrindinės funkcijos.
#pragma įspėjimo direktyva
Ši direktyva naudojama norint paslėpti įspėjamąjį pranešimą, kuris rodomas kompiliavimo metu. Galime paslėpti įspėjimus, kaip parodyta žemiau:
- #pragma įspėjimas -rvl : ši direktyva paslepia tuos įspėjimus, kurie iškeliami, kai funkcija, turinti grąžinti reikšmę, nepateikia reikšmės.
- #pragma perspėti -par : ši direktyva paslepia tuos įspėjimus, kurie iškeliami, kai funkcija nenaudoja jai perduotų parametrų.
- #pragma įspėjimas -rch : ši direktyva slepia tuos įspėjimus, kurie pateikiami, kai kodas nepasiekiamas. Pavyzdžiui, bet koks kodas, parašytas po grąžinti funkcijos teiginys nepasiekiamas.
Jei jums patinka techcodeview.com ir norėtumėte prisidėti, taip pat galite parašyti straipsnį naudodami . Peržiūrėkite savo straipsnį pagrindiniame techcodeview.com puslapyje ir padėkite kitiems Geeks. Rašykite komentarus, jei radote ką nors neteisingo arba norite pasidalinti daugiau informacijos aukščiau aptarta tema.