C-ohjelman kääntäminen – kulissien takaa
Esiprosessori on järjestelmäohjelmisto (tietokoneohjelma, joka on suunniteltu toimimaan tietokoneen laitteistossa ja sovellusohjelmissa). Se suorittaa korkean tason kielen(HLL) esikäsittelyn. Esikäsittely on kielenkäsittelyjärjestelmän ensimmäinen vaihe. Kielenkäsittelyjärjestelmä kääntää korkean tason kielen konetason kieleksi tai absoluuttiseksi konekoodiksi(eli koneen ymmärtämään muotoon).
- Esikäsittelijä ei tunne C:n laajuussääntöjä. Esikäsittelijän direktiivit, kuten #define, tulevat voimaan heti, kun ne nähdään, ja ne pysyvät voimassa ne sisältävän tiedoston loppuun asti; ohjelman lohkorakenteella ei ole merkitystä.
Edukäsittelijä suorittaa HLL-koodille pääasiassa kolme tehtävää :
- Kommenttien poistaminen : Se poistaa kaikki kommentit. Kommentti kirjoitetaan vain siksi, että ihmiset ymmärtäisivät koodia. On siis selvää, että niistä ei ole mitään hyötyä koneelle. Joten esiprosessori poistaa kaikki ne, koska niitä ei tarvita suorituksessa eikä niitä myöskään suoriteta.
Näin näet tiedoston, josta on poistettu kommentit linuxissa) :
Kirjoita C-koodi (tiedoston nimi olkoon prog.c). Esikäsittele se komennolla gcc -E prog.c
Näet tulosteen, jossa koodissa ei ole kommentteja.
Tämä tiedosto tallennetaan ’.i’-päätteellä (prog.i), joka syötetään kääntäjälle. - Tiedoston sisällyttäminen : Sisältää kaikki kirjaston tiedostot, joita ohjelmamme tarvitsee. HLL:ssä kirjoitamme #include, joka on esiprosessorille annettu direktiivi, joka käskee sitä sisällyttämään määritetyn kirjastotiedoston sisällön. Esimerkiksi #include käskee esiprosessoria sisällyttämään kirjastotiedoston stdio.h koko sisällön.
Tämä voidaan kirjoittaa myös käyttämällä lainausmerkkejä – #include ”stdio.h”
Huomautus: Jos tiedostonimi on hakasulkujen sisällä, tiedosto etsitään kääntäjän vakiomuotoisista include-poluista. Jos tiedostonimi on suljettu kaksoisten lainausmerkkien sisään, hakupolku laajennetaan niin, että se sisältää nykyisen lähdekoodihakemiston. - Makrojen laajentaminen : Makroja voidaan kutsua pieninä funktioina, joiden käsittely ei ole yhtä kuormittavaa. Jos meidän on kirjoitettava funktio (jolla on pieni määritelmä), jota on kutsuttava rekursiivisesti (uudestaan ja uudestaan), meidän pitäisi suosia makroa funktion sijasta.
Näiden makrojen määrittely tapahtuu siis esikäsittelijän avulla.#define SI 1000
on yksinkertainen esimerkki makrosta.
- Makroja on kahdenlaisia: Objektien kaltaisia (eivät ota parametreja) ja funktioiden kaltaisia (voivat ottaa parametreja)
// object-like macro#define // function-like macro #define ()
- Makron määritelmän voi poistaa komennolla #undef:
// delete the macro# undef
- Voimme kirjoittaa monirivisiä makroja samoin kuin funktioita, mutta jokainen lauseke päättyy ”\”.
#include <stdio.h>
#define MACRO(num, str) {\
printf
(
"%d"
, num);\
printf
(
" is"
);\
printf
(
" %s number"
, str);\
printf
(
"\n"
);\
}
- Makroja on kahdenlaisia: Objektien kaltaisia (eivät ota parametreja) ja funktioiden kaltaisia (voivat ottaa parametreja)
Tämän artikkelin on kirjoittanut Diksha. Jos pidät GeeksforGeeksistä ja haluat osallistua, voit myös kirjoittaa artikkelin osoitteessa contribute.geeksforgeeks.org tai lähettää artikkelisi sähköpostitse osoitteeseen [email protected]. Näet artikkelisi näkyvän GeeksforGeeksin pääsivulla ja autat muita geekkejä.