logo

C Priekšapstrādātāji

Priekšprocesori ir programmas, kas apstrādā avota kodu pirms kompilācijas. Starp programmas rakstīšanu un programmas izpildi programmā C ir jāveic vairākas darbības. Apskatīsim šīs darbības, pirms sākam mācīties par priekšprocesoriem.

priekšapstrādātāji c



Iepriekš redzamajā diagrammā varat redzēt starpposmus. Programmētāju rakstītais pirmkods vispirms tiek saglabāts failā, lai nosaukums būtu tāds programma.c . Pēc tam šo failu apstrādā priekšapstrādātāji un tiek ģenerēts izvērsta avota koda fails ar nosaukumu program.i. Šo izvērsto failu apkopo kompilators, un tiek ģenerēts objekta koda fails ar nosaukumu program.obj. Visbeidzot, saistītājs saista šo objekta koda failu ar bibliotēkas funkciju objekta kodu, lai ģenerētu izpildāmo failu program.exe.

Priekšapstrādātāju direktīvas C

Priekšapstrādātāja programmas nodrošina priekšprocesoru direktīvas, kas liek kompilatoram pirms kompilēšanas iepriekš apstrādāt avota kodu. Visas šīs priekšapstrādātāja direktīvas sākas ar simbolu “#” (jaucējzīme). Simbols # norāda, ka jebkurš priekšraksts, kas sākas ar #, tiks izpildīts priekšapstrādātāja programmā. Šīs priekšapstrādātāja direktīvas varam ievietot jebkur mūsu programmā.

Dažu priekšapstrādātāja direktīvu piemēri ir: #iekļauts , #definēt , #ifndef, utt.



Piezīme Atcerieties, ka # simbols nodrošina tikai ceļu uz priekšapstrādātāju, un komandu, piemēram, iekļaut, apstrādā priekšapstrādātāja programma. Piemēram, #include jūsu programmā iekļaus norādītā faila kodu vai saturu.

Priekšapstrādātāja direktīvu saraksts C

Šajā tabulā ir uzskaitītas visas C priekšapstrādātāja direktīvas:

Priekšapstrādātāju direktīvas

Apraksts



#definēt

Izmanto, lai definētu makro

#undef

Izmanto, lai atceltu makro definēšanu

#iekļauts

Izmanto, lai iekļautu failu avota koda programmā

#ifdef

Izmanto, lai iekļautu koda sadaļu, ja noteikts makro ir definēts ar #define

#ifndef

Izmanto, lai iekļautu koda sadaļu, ja noteikts makro nav definēts ar #define

#ja

Pārbaudiet norādīto stāvokli

#cits

Alternatīvs kods, kas tiek izpildīts, ja #if neizdodas

#endif

Izmanto, lai atzīmētu #if, #ifdef un #ifndef beigas

Šos priekšapstrādātājus var klasificēt atkarībā no to veiktās funkcijas veida.

C priekšapstrādātāju veidi

Ir 4 galvenie priekšapstrādātāju direktīvu veidi:

  1. Makro
  2. Failu iekļaušana
  3. Nosacītā kompilācija
  4. Citas direktīvas

Tagad sīkāk uzzināsim par katru no šīm direktīvām.

1. Makro

C valodā makro ir koda daļas programmā, kurai ir piešķirts kāds nosaukums. Ikreiz, kad kompilators saskaras ar šo nosaukumu, kompilators aizstāj nosaukumu ar faktisko koda daļu. The '#definēt' direktīvu izmanto, lai definētu makro.

Makro definīcijas sintakse

  #define     token     value>

kur pēc pirmapstrādes, žetons tiks paplašināts līdz tā vērtību programmā.

Makro piemērs

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; }>

pārvērst par virkni java
>

>

Izvade

0 1 2 3 4>

Iepriekš minētajā programmā, kad kompilators izpilda vārdu LIMIT, tas aizstāj to ar 5. Vārds 'LIMIT' makro definīcijā sauc par makro veidni un '5' ir makro paplašinājums.

Piezīme Makro definīcijas beigās nav semikola (;). Makro definīciju beigās nav nepieciešams semikāls.

Ir arī daži Iepriekš definēti makro C kas ir noderīgi, lai mūsu programmai nodrošinātu dažādas funkcijas.

Makro ar argumentiem

Argumentus varam nodot arī makro. Ar argumentiem definētie makro darbojas līdzīgi kā funkcijas.

Piemērs

  #define   foo(  a, b  )   a + b  #define func(r) r * r>

Ļaujiet mums to saprast ar programmu:

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;> }>

>

>

Izvade

Area of rectangle is: 50>

No iepriekš minētās programmas mēs redzam, ka ikreiz, kad kompilators programmā atrod AREA(l, b), tas to aizstāj ar paziņojumu (l*b). Paziņojumā (l*b) tiks aizstāts ne tikai tas, bet arī makro veidnei AREA(l, b) nodotās vērtības. Tāpēc AREA(10, 5) būs vienāds ar 10*5.

2. Failu iekļaušana

Šāda veida priekšprocesora direktīva liek kompilatoram iekļaut failu avota koda programmā. The #iekļaut priekšapstrādātāja direktīvu tiek izmantots, lai iekļautu galvenes failus programmā C.

Ir divu veidu faili, kurus lietotājs var iekļaut programmā:

Standarta galvenes faili

Standarta galvenes faili satur tādu iepriekš definētu funkciju definīcijas kā printf(), scanf(), utt. Šie faili ir jāiekļauj, lai tie darbotos ar šīm funkcijām. Dažādos galvenes failos tiek deklarētas dažādas funkcijas.
Piemēram, standarta I/O funkcijas atrodas failā “iostream”, savukārt funkcijas, kas veic virknes darbības, atrodas failā “virkne”.

Sintakse

  #include   <  file_name>>> 

kur faila nosaukums ir iekļaujamā galvenes faila nosaukums. The ‘’ iekavas sakiet kompilatoram meklēt failu s standarta direktorijs.

Lietotāja definēti galvenes faili

Ja programma kļūst ļoti liela, ieteicams to sadalīt mazākos failos un iekļaut tos, kad vien nepieciešams. Šāda veida faili ir lietotāja definēti galvenes faili.

Sintakse

The dubultpēdiņas ( ) sakiet kompilatoram meklēt galvenes failu avota faila direktoriju.

3. Nosacītā kompilācija

Nosacītā kompilācija C direktīvās ir direktīvas veids, kas palīdz apkopot noteiktu programmas daļu vai izlaist kādas konkrētas programmas daļas apkopošanu, pamatojoties uz dažiem nosacījumiem. Nosacījuma koda ievietošanai tiek izmantotas šādas priekšapstrādātāja direktīvas:

  1. #if direktīva
  2. #ifdef direktīva
  3. #ifndef direktīva
  4. #cita direktīva
  5. #elif direktīva
  6. #endif direktīva

#endif direktīva tiek izmantota, lai aizvērtu #if, #ifdef un #ifndef atvēršanas direktīvas, kas nozīmē, ka šo direktīvu priekšapstrāde ir pabeigta.

Sintakse

  #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>

Ja makro ar nosaukumu ' makro_nosaukums ‘ ir definēts, tad priekšrakstu bloks tiks izpildīts normāli, bet, ja tas nav definēts, kompilators vienkārši izlaidīs šo priekšrakstu bloku.

Piemērs

Tālāk sniegtajā piemērā ir parādīts priekšapstrādātāja direktīvu #include #if, #elif, #else un #endif lietošana.

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;> }>

>

>

Izvade

PI is defined Square is not defined>

4. Citas direktīvas

Papildus iepriekš minētajām direktīvām ir vēl divas direktīvas, kuras netiek plaši izmantotas. Šie ir:

string.format java
  1. #undef direktīva
  2. #pragma direktīva

1. #undef direktīva

#undef direktīva tiek izmantota, lai atceltu esoša makro definīciju. Šī direktīva darbojas kā:

#undef LIMIT>

Izmantojot šo paziņojumu, tiks atcelta esošā makro LIMIT definīcija. Pēc šī paziņojuma katrs #ifdef LIMIT priekšraksts tiks novērtēts kā nepatiess.

Piemērs

Tālāk sniegtais piemērs parāda #undef direktīvas darbību.

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;> }>

>

>

Izvade

Min value is: 10 Min value after undef and again redefining it: 20>

2. #pragma direktīva

Šī direktīva ir īpašam nolūkam paredzēta direktīva, un to izmanto, lai ieslēgtu vai izslēgtu dažas funkcijas. Šāda veida direktīvas ir specifiskas kompilatoram, t.i., tās atšķiras atkarībā no kompilatora.

Sintakse

#pragma   directive>

Dažas no #pragma direktīvām ir aplūkotas tālāk:

  1. #pragma startēšana: Šīs direktīvas palīdz mums norādīt funkcijas, kas ir jāpalaiž pirms programmas palaišanas (pirms vadīkla tiek nodota main()).
  2. #pragma izeja : Šīs direktīvas palīdz mums norādīt funkcijas, kas ir jāizpilda tieši pirms programmas iziešanas (tieši pirms vadīklas atgriešanās no main()).

Zemāk redzamā programma nedarbosies ar GCC kompilatoriem.

Piemērs

Zemāk esošā programma ilustrējiet #pragma exit un pragma startup izmantošanu

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;> }>

>

>

Paredzamā izvade

Inside func1() Inside main() Inside func2()>

Iepriekš minētais kods radīs izvadi, kā norādīts tālāk, ja tiks palaists GCC kompilatoros:

Inside main()c>

Tas notiek tāpēc, ka GCC neatbalsta #pragma startēšanu vai iziešanu. Tomēr GCC kompilatoru paredzamajai izvadei varat izmantot tālāk norādīto kodu.

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;> }>

robeža, izmantojot css

>

>

Izvade

Inside func1() Inside main() Inside func2()>

Iepriekš minētajā programmā mēs esam izmantojuši dažus specifiskas sintakses lai viena no funkcijām izpildītos pirms galvenās funkcijas, bet otra pēc galvenās funkcijas.

#pragmabrīdinājuma direktīva

Šī direktīva tiek izmantota, lai paslēptu brīdinājuma ziņojumu, kas tiek parādīts kompilācijas laikā. Mēs varam paslēpt brīdinājumus, kā parādīts zemāk:

  • #pragma brīdināt -rvl : šī direktīva slēpj tos brīdinājumus, kas tiek parādīti, ja funkcija, kurai ir jāatgriež vērtība, neatgriež vērtību.
  • #pragma brīdināt -par : šī direktīva slēpj tos brīdinājumus, kas tiek parādīti, ja funkcija neizmanto tai nodotos parametrus.
  • #pragma brīdināt -rch : šī direktīva slēpj tos brīdinājumus, kas tiek parādīti, ja kods nav sasniedzams. Piemēram, jebkurš kods, kas rakstīts pēc atgriezties paziņojums funkcijā nav sasniedzams.

Ja jums patīk techcodeview.com un vēlaties sniegt savu ieguldījumu, varat arī uzrakstīt rakstu, izmantojot . Skatiet savu rakstu techcodeview.com galvenajā lapā un palīdziet citiem Geeks. Lūdzu, rakstiet komentārus, ja atrodat kaut ko nepareizu vai vēlaties dalīties ar plašāku informāciju par iepriekš apspriesto tēmu.