C programazio-lengoaia (XI). Aurrekonpiladorea eta liburutegia
1992/01/01 Alegria Loinaz, Iñaki | Maritxalar, Montse Iturria: Elhuyar aldizkaria
C lengoaiaz programatzen dugunean, konpiladoreek zein estekatzaileek (linker izenekoek) eskaintzen dizkiguten laguntzak nola erabil ditzakegun azaltzea da kapitulu honen helburua.
Konpilazio-prozesua bi fasetan gertatzen da: lehenean (aurrekonpilazioa deitutakoan) aurrekonpiladoreari zuzendutako sententziak edo sasiaginduak tratatzen diren bitartean, bigarrenean konpiladore guztiek burutzen duten itzulpen-prozesua gertatzen da, eta ondorioz, objektu-programa lortzen da.
Estekatzaileak objektu-modulu bat edo gehiago lotzen ditu (tink), haien arteko erreferentzia gurutzatuak ebatziz eta programa exekutagarria lortuz. Lotzen diren moduluak erabiltzailearenak edota estandarrak izan daitezke, azken hauen ezaugarriak honako hauek direlarik: C liburutegian daude, aukera asko eskaintzen dute eta C-k duen ahalmenaren atal nagusietako bat da.
Aurkeztutako elementu hauek azaltzeko, ondoko hiru ataletan bananduko dugu kapitulu hau: aurrekonpiladorea, liburutegi estandarra eta erabiltzailearen liburutegiak izeneko ataletan hain zuzen.
Aurrekonpiladorea
Aurrekonpiladoreak eskaintzen dituen aukera nagusiak honako hiru hauek dira:
- Konstante parametrizatu eta makroen definizioa, #define sasiaginduaren bidez.
- Beste iturburu-modulu bat edo gehiago programan sartzea, #include sasiaginduaren bidez.
- Baldintzapeko konpilazio-zatiak ezartzea, #ifdef eta #endif sasiaginduen bidez
#define sasiagindua
Sasiagindu honen bidez konstante eta makroen definizioa egiten da seigarren kapituluan ikusi genuenez. Beraz, izen bati balio edo agindu-sekuentzia egokitzen zaio, eta ondorioz, konpiladoreak izena aurkitzean, izen horri dagokion balioa edo agindu-sekuentzia ordezkatu eta konpilatu egiten du. 1. programan adibide bat ikus daiteke:
![](images/A55025.jpg)
Definizioaren esanahiak moduluaren bukaeraraino irauten du #undef sasiagindua erabiltzen ez bada. Sasiagindu berri hau interesgarri gertatzen da definizioari esanahi berri bat emateko; konpiladore batzuek birdefinizioa baino lehen hala egitea eskatzen bait dute.
#include sasiagindua
Sasiagindu honen bidez iturburu-programa bat beste baten barruan sar daiteke, liburutegiaren kontzeptua iturburu-mailara hedatuz.
Sasiagindua idazteko era hau da:
#include <fitxategi izena> edo
#include "fitxategi izena"
Fitxategi izena-k sartu nahi den fitxategiak duen izena zehazten du eta .h motakoa izatea gomendatzen da; horrela bereizten bait dira izenburu (header) deitutako fitxategiak. < eta > edo " erabiltzen desberdintasuna, fitxategiaren kokapenean datza. C ren izenburu-fitxategi estandarra bada, < eta > artean jarriko da konpiladoreak ezagutzen duen katalogoan bila dezan. " artean egoteak, aldiz, erabiltzailearen izenburu-fitxategia dela adierazten du eta sistema eregileak adierazitako katalogoan bilatuko du.
Izenburu-fitxategiak liburutegiekin eta konpilazio banatuarekin batera erabiltzen dira. Funtzio batzuk modulu banatu batean konpilatzen badira estekatzailea arduratuko da moduluen arteko loturaz, baina modulu banatuan erabiltzen diren parametroak, datu-motak, aldagai globalen definizioa zein funtzioen motak beste moduluetan erazagutu behar direnez, erosoena izenburu-fitxategi batean aipaturiko definizioak sartzea da. Fitxategi hori modulu banatuaren funtzioek erabiltzen dituzten programetan sartuko da include baten bidez. 2. programan honen adibide bat ikus daiteke:
![](images/A55025-a.jpg)
#ifdef, #endif sasiaginduak
Sasiagindu hauen bidez baldintzapeko konpilazioa egitea posiblea da. Konpilazio-aukera honen bidez agindu-sekuentzia bat programaren barruan sartuko da definizioa indarrean badago, ala konpiladoreak ez du kontutan hartuko, definizio hori ez badago. Definizioa kontrolatzeko #define eta #undef sasiaginduez gain konpilazio-komandoaren (cc edo msc) -D aukera erabil daiteke.
Baldintzapeko aukera hau interesgarria suertatzen da makina desberdinetarako programa bat garatzen ari garenean eta makinaren baterako tratamendu berezia egin behar denean.
![](images/A55025-b.jpg)
Adibidez, programa batek inprimagailuaren erregistroa zuzenean maneiatu behar badu, 3. programan azaldutakoa egin daiteke makina desberdinetako helbideak kontutan hartzeko.
Liburutegi estandarra
6. kapituluan azaldu genuenez, funtzioak erabili baino lehen definitu egin behar dira, baina badago aurredefinituta dagoen funtzio-multzo bat; funtzio estandarraren multzoa, edo, gauza bera dena, liburutegi estandarreko funtzioak. Batzuk aztertu ditugu printf eta scanf bezala, baina besteak ez.
1. taulan funtzio garrantzitsuenen zerrenda agertzen da; sarrera/irteerakoak salbu, hauek hurrengo kapituluan azalduko dira eta. Funtzioen ondoan, dagokien izenburu fitxategiaren izena zehazten da; funtzio estandarrak erabiltzeko dagokien izenburua #include batez zehaztu behar bait da.
4. programan memoria dinamikoa erabiltzen duen modulu bat azaltzen da eta 1. eskeman dagokion konpilazio- eta estekaketa-programak.
Erabiltzailearen liburutegiak
Programazio egituratuak eta softwarearen injineritzak agindu bezala, programak luzeak direnean funtziotan banatu behar dira, funtzio-multzoak osatuz, horietako bakoitza bere aldetik konpilatu eta probatuko delarik. Horrela sortutako moduluak liburutegi batean kataloga daitezke, estekatzaileak erabil ditzan erreferentziatzen dituzten programekin. Horretarako 9. kapituluan aztertutako aldagaien ezaugarriak kontutan hartu behar dira.
![](images/A55025-c.jpg)
Bide honetan oso komenigarria da objektu-modulu edo liburutegi bakoitzeko izenburu-fitxategi bat egitea, bertan konstante eta datu-moten definizioa zein funtzioen erazagupena egingo delarik. 2. eskeman, ikusitako 2. programari dagokion konpilazio-estekaketaren eskema azaltzen da.
Bigarren eskema horretan logika.o aparteko modulua da, baina ez da liburutegi batean katalogatu. Horretarako ar (UNIXekin) programa erabili behar da eta estekatzeko komandoa aldatu. Geldituko litzatekeen komando-multzoa honako hau litzateke:
![](images/A55025-d.jpg)
![](images/A55025-e.jpg)
![](images/A55025-f.jpg)
![](https://elia.eus/static/elhuyar/img/elia_RGB.png)
Gai honi buruzko eduki gehiago
Elhuyarrek garatutako teknologia