logo

C Pirminiai procesoriai

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.

pirminiai procesoriai c



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:

  1. Makrokomandos
  2. Failo įtraukimas
  3. Sąlyginis kompiliavimas
  4. 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:

  1. #if direktyva
  2. #ifdef direktyva
  3. #ifndef direktyva
  4. #kita direktyva
  5. #elif direktyva
  6. #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:

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

  1. #pragma paleidimas: Šios direktyvos padeda mums nurodyti funkcijas, kurias reikia vykdyti prieš paleidžiant programą (prieš valdikliui pereinant į main()).
  2. #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.