logo

C Forbehandlere

Forbehandlere er programmer som behandler kildekoden før kompilering. Det er flere trinn involvert mellom å skrive et program og å kjøre et program i C. La oss ta en titt på disse trinnene før vi faktisk begynner å lære om Preprosessorer.

forprosessorer i c



Du kan se de mellomliggende trinnene i diagrammet ovenfor. Kildekoden skrevet av programmerere lagres først i en fil, la navnet være program.c . Denne filen blir deretter behandlet av forprosessorer og en utvidet kildekodefil genereres kalt program.i. Denne utvidede filen kompileres av kompilatoren og en objektkodefil genereres med navnet program.obj. Til slutt kobler linkeren denne objektkodefilen til objektkoden til bibliotekfunksjonene for å generere den kjørbare filen program.exe.

Forbehandlerdirektiver i C

Forbehandlerprogrammer gir forbehandlerdirektiver som forteller kompilatoren å forhåndsbehandle kildekoden før kompilering. Alle disse forbehandlerdirektivene begynner med et '#' (hash)-symbol. '#'-symbolet indikerer at enhver setning som starter med en '#' vil gå til forbehandlerprogrammet for å bli utført. Vi kan plassere disse forbehandlerdirektivene hvor som helst i programmet vårt.

Eksempler på noen forbehandlerdirektiver er: #inkludere , #definere , #ifndef, etc.



Merk Husk at # symbolet gir bare en bane til forprosessoren, og en kommando som inkluderer behandles av forprosessorprogrammet. For eksempel vil #include inkludere koden eller innholdet til den angitte filen i programmet ditt.

Liste over forbehandlerdirektiver i C

Følgende tabell viser alle forbehandlerdirektivene i C:

Forbehandlerdirektiver

Beskrivelse



#definere

Brukes til å definere en makro

#undef

Brukes til å udefinere en makro

#inkludere

Brukes til å inkludere en fil i kildekodeprogrammet

#ifdef

Brukes til å inkludere en kodedel hvis en bestemt makro er definert av #define

#ifndef

Brukes til å inkludere en kodedel hvis en bestemt makro ikke er definert av #define

#hvis

Se etter den angitte tilstanden

#ellers

Alternativ kode som kjøres når #if mislykkes

#slutt om

Brukes til å markere slutten på #if, #ifdef og #ifndef

Disse forprosessorene kan klassifiseres basert på hvilken type funksjon de utfører.

Typer C-forprosessorer

Det er 4 hovedtyper av forbehandlerdirektiver:

  1. Makroer
  2. Filinkludering
  3. Betinget kompilering
  4. Andre direktiver

La oss nå lære om hver av disse direktivene i detalj.

1. Makroer

I C er makroer kodebiter i et program som får et navn. Hver gang kompilatoren møter dette navnet, erstatter kompilatoren navnet med den faktiske kodebiten. De '#definere' direktiv brukes til å definere en makro.

Syntaks for makrodefinisjon

  #define     token     value>

hvor etter forbehandling, den token vil bli utvidet til sin verdi i programmet.

Eksempel på makro

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

>

>

Produksjon

0 1 2 3 4>

I programmet ovenfor, når kompilatoren kjører ordet LIMIT, erstatter den det med 5. Ordet 'GRENSE' i makrodefinisjonen kalles en makromal og '5' er makroutvidelse.

Merk Det er ingen semikolon (;) på slutten av makrodefinisjonen. Makrodefinisjoner trenger ikke et semikolon for å avslutte.

Det er også noen Forhåndsdefinerte makroer i C som er nyttige for å gi ulike funksjoner til programmet vårt.

Makroer med argumenter

Vi kan også sende argumenter til makroer. Makroer definert med argumenter fungerer på samme måte som funksjoner.

Eksempel

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

La oss forstå dette med et 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;> }>

>

>

Produksjon

Area of rectangle is: 50>

Vi kan se fra programmet ovenfor at hver gang kompilatoren finner AREA(l, b) i programmet, erstatter den det med setningen (l*b). Ikke bare dette, men verdiene som sendes til makromalen AREA(l, b) vil også bli erstattet i setningen (l*b). Derfor vil AREA(10, 5) være lik 10*5.

2. Filinkludering

Denne typen forprosessordirektiv forteller kompilatoren å inkludere en fil i kildekodeprogrammet. De #include preprocessor-direktiv brukes til å inkludere header-filene i C-programmet.

Det er to typer filer som kan inkluderes av brukeren i programmet:

Standard topptekstfiler

Standard header-filene inneholder definisjoner av forhåndsdefinerte funksjoner som printf(), scanf(), etc. Disse filene må inkluderes for å fungere med disse funksjonene. Ulike funksjoner er deklarert i forskjellige overskriftsfiler.
For eksempel er standard I/O-funksjoner i 'iostream'-filen, mens funksjoner som utfører strengoperasjoner er i 'string'-filen.

Syntaks

  #include   <  file_name>>

hvor filnavn er navnet på overskriftsfilen som skal inkluderes. De ‘’ parenteser be kompilatoren se etter filen i s tandard katalog.

Brukerdefinerte topptekstfiler

Når et program blir veldig stort, er det en god praksis å dele det opp i mindre filer og inkludere dem når det er nødvendig. Disse filtypene er brukerdefinerte overskriftsfiler.

Syntaks

  #include   '  filename  '>

De doble anførselstegn ( ) be kompilatoren søke etter header-filen i kildefilens katalog.

3. Betinget kompilering

Betinget sammenstilling i C-direktiver er en type direktiv som hjelper til med å kompilere en bestemt del av programmet eller hoppe over kompileringen av en bestemt del av programmet basert på noen forhold. Det er følgende forbehandlerdirektiver som brukes til å sette inn betinget kode:

  1. #if-direktivet
  2. #ifdef-direktivet
  3. #ifndef-direktivet
  4. #else-direktivet
  5. #elif-direktivet
  6. #endif-direktivet

#slutt om direktiv brukes til å stenge av åpningsdirektivene #if, #ifdef og #ifndef, noe som betyr at forbehandlingen av disse direktivene er fullført.

Syntaks

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

Hvis makroen med navnet ' makronavn ' er definert, vil blokken med setninger kjøre normalt, men hvis den ikke er definert, vil kompilatoren ganske enkelt hoppe over denne setningsblokken.

Eksempel

Eksemplet nedenfor viser bruken av #include #if, #elif, #else og #endif forprosessordirektiver.

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

tilfeldig i c
>

>

Produksjon

PI is defined Square is not defined>

4. Andre direktiver

Bortsett fra de ovennevnte direktivene, er det ytterligere to direktiver som ikke er vanlig å bruke. Disse er:

  1. #undef-direktivet
  2. #pragmadirektivet

1. #undef-direktivet

#undef-direktivet brukes til å udefinere en eksisterende makro. Dette direktivet fungerer som:

#undef LIMIT>

Bruk av denne setningen vil udefinere den eksisterende makro LIMIT. Etter denne setningen vil hver #ifdef LIMIT-setning vurderes som usann.

Eksempel

Eksemplet nedenfor viser hvordan #undef-direktivet fungerer.

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

>

>

Produksjon

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

2. #pragmadirektivet

Dette direktivet er et spesialdirektiv og brukes til å slå på eller av enkelte funksjoner. Disse typer direktiver er kompilatorspesifikke, det vil si at de varierer fra kompilator til kompilator.

Syntaks

#pragma   directive>

Noen av #pragma-direktivene er omtalt nedenfor:

  1. #pragma oppstart: Disse direktivene hjelper oss med å spesifisere funksjonene som er nødvendige for å kjøre før oppstart av programmet (før kontrollen går over til main()).
  2. #pragma exit : Disse direktivene hjelper oss med å spesifisere funksjonene som er nødvendige for å kjøre rett før programmet avsluttes (rett før kontrollen kommer tilbake fra main()).

Programmet nedenfor vil ikke fungere med GCC-kompilatorer.

Eksempel

Programmet nedenfor illustrere bruken av #pragma exit og pragma oppstart

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

>

>

Forventet utgang

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

Koden ovenfor vil produsere utdata som gitt nedenfor når den kjøres på GCC-kompilatorer:

Inside main()c>

Dette skjer fordi GCC ikke støtter #pragma oppstart eller exit. Du kan imidlertid bruke koden nedenfor for forventet utgang på GCC-kompilatorer.

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

>

>

Produksjon

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

I programmet ovenfor har vi brukt noen spesifikke syntakser slik at en av funksjonene kjøres før hovedfunksjonen og den andre kjøres etter hovedfunksjonen.

#pragma warn-direktivet

Dette direktivet brukes til å skjule advarselsmeldingen som vises under kompilering. Vi kan skjule advarslene som vist nedenfor:

  • #pragma advare -rvl : Dette direktivet skjuler de advarslene som vises når en funksjon som skal returnere en verdi ikke returnerer en verdi.
  • #pragma advare -par : Dette direktivet skjuler advarslene som vises når en funksjon ikke bruker parameterne som er sendt til den.
  • #pragma advare -rch : Dette direktivet skjuler advarslene som vises når en kode ikke er tilgjengelig. For eksempel, hvilken som helst kode skrevet etter komme tilbake setningen i en funksjon er uoppnåelig.

Hvis du liker techcodeview.com og ønsker å bidra, kan du også skrive en artikkel ved hjelp av . Se artikkelen din som vises på techcodeview.com-hovedsiden og hjelp andre nerder. Vennligst skriv kommentarer hvis du finner noe feil, eller hvis du vil dele mer informasjon om emnet diskutert ovenfor.