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.

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:
- Makroer
- Filinkludering
- Betinget kompilering
- 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:
- #if-direktivet
- #ifdef-direktivet
- #ifndef-direktivet
- #else-direktivet
- #elif-direktivet
- #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:
- #undef-direktivet
- #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:
- #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()).
- #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.