Mi a modul?
A modul egy önállóan is lefordítható forráskód. Ez általában .c vagy .h kiterjesztéssel tárolódik a lemezen.
A .c file kódot is tartalmazó forráskód. Ebből generálódik a fordítás során a tárgykód, melyekből a szerkesztő program képes a futtatható programot előállítani.
Egyszerű esetben egy C nyelvi program egy modulból áll. Ez szinte sosem igaz, mert jellemzően valamely (több) könyvtári függvényeke, s ezek a könyvtári (külső) modulokban vannak megírva.
Ilyen könyvtári függvények a printf, scanf, a véletlenszám-előállító függvények, a matematikai függvények, stb.
Header file tartalma
A Header file-ok jellemzően .h kiterjesztéssel tárolódnak a lemezen. A header fileok a modulok közötti interface cserének leírását tartalmazza. Egy header file egy (általában egyező .c kiterjesztésű) modul interface-t írja le.
Tartalmazza a modul exportált függvényeinek leírását (függvény-prototípus), az exportált típusokat, konstansokat, valamint a modulon belül definiált változók deklarációját, hogy más modulok is tudják a változót használni. Ez utóbbi egyébként nagyon ritka eset, nem jellemző.
A függvény-prototípus nem más, mint a függvény fejrésze a törzse nélkül. Ezen információ, ha rendelkezésre áll, úgy a fordító engedélyezi a függvény meghívását, mivel képes a paraméterlisták összevetésére, helyességének ellenőrzésére.
Pl:
double sinus( double x );
A változók deklarációja a változó típusából és nevéből áll, de extern kulcsszóval van megjelölve:
extern int a;
Header file védelme
A header file-okat egyetlen modulba akár véletlenül, akár szándékosan többször is be lehet emelni az #include segítségével. Hogy ne kerüljön sor a header file tartalmának többszöri kiértékelésére, a header file-okat ez ellen védeni szoktuk:
#ifdef __sajat_h#define __sajat_h
...... a header
... tényleges tartalma...
#endif
Ezen formában a header file legelső beemelésekor a sajat.h nevű literál még nincs definiálva, így a beemelés során az ifdef->endif sorok mindegyike feldolgozásra kerül. Ennek során viszont a #define miatt definiálódik a literál, így a második, és további beemelések során az ifdef->endif sorok egyike sem kerül feldolgozásra.
Header file beemelése
A header file-okat az #include előfordító-direktíva segítségével emeljük be a modulba. Hatására az előfordító a megadott file-t az adott sor helyébe beszúrja (beolvassa), és csak utána folytatja a file további sorainak feldolgozását.
Két formája van:
#include <filenev> Pl.:
#inculde <stdio.h>
Ekkor a megadott file-t a C rendszer include alkönyvtáraiban keresi.
#include ”filenev” Pl.:
#include ”sajat.h”
Ekkor a megadott file-t az aktuális könyvtárban keresi.
Lehetőség van relatív útvonalak beírására:
#include <gl/gl.h>
A fenti példában a rendszer include alkönyvtárából nyíló ’gl’ alkönyvtárában található gl.h nevű file-t fogja feldolgozni (beszúrni).
Fordítás
Amennyiben van egy kész .c modulunk, úgy szükségünk van egy C fordítóra. Ebből elég sok áll rendelkezésre, sőt, komplett C fejlesztői rendszerek is támogatják a munkánkat.
Amennyiben a Microsoft Visual C fordítót használnánk, úgy a cl.exe file-ra lesz szükségünk.
Használata:
cl /c <filenev>, példáulPl.:
cl /c helloworld.c
Ennek során generálódik az aktuális alkönyvtárban egy helloworld.obj nevű file, mely a programunk gépi kódú alakját tartalmazza.
A /c jelentése: csak fordítás. Ennek hiányában a fordítóprogram automatikusan meghívja a szerkesztőprogramot, hogy szerkessze is össze a futtatható programot.
Pl:
cl helloworld.c
Szerkesztés
Amennyiben van egy kész lefordított gépi kódú modulunk, akkor szerkesztőprogramra van szükség. Javasolt ugyanazon rendszer szerkesztőjét használni, mint amelyikkel a gépi kódú modult előállítottuk, de egyéb szerkesztők is szóba jöhetnek.
Amennyiben a Microsoft Visual rendszert használjuk, úgy a szerkesztőt link.exe-nek hívják.
Használata:
link <filenev> Pl.:
link helloworld.obj
Ennek hatására az aktuális alkönyvtárban generálódik egy helloworld.exe futtatható file.
Ne felejtsük el, hogy a szerkesztőprogram már nem dolgozik a forráskódunkkal, őt tehát a .c kiterjesztésű file ’nem érdekli’. A szerkesztőprogram feladata a lefordított, gépi kódú modulokból a futtatható program előállítása.