Subpunt anterior Subpunt posterior Punt precedent Titol Contingut


4.2. Compilació separada.

- Si un programa és molt llarg, és convenient "partir-lo" en troços modulars. És a dir, agrupar en fitxers separats les funcions que estan lògicament relacionades, per exemple, les funcions d'inicialització, càlculs, representació gràfica, funcions principals, etc. Després es pot compilar cada mòdul per separat, testejar de forma independent, reaprofitar funcions per altres programes, etc.

- Quan en un mòdul es crida a funcions d'altres mòduls, cal definir els prototipus de les funcions "externes", per a que el compilador pugui fer comprovació de tipus quan compili el mòdul que crida (no té accés als altres mòduls). Per fer això el C proporciona l'operador extern, que indica que les funcions i variables que s'especifiquen darrera es troben en altres mòduls.

ex 4.3: Com a exemple pedagògic definirem el mòdul LONGCAD.C amb la funció strlen() que retorna la longitud d'una cadena de caràcters, i un mòdul PRIMER.C amb la funció principal main() que crida a la funció strlen() :

/* longcad.c */

/* primer.c */

Representació gràfica de la compilació separada:

- Si volem "amagar" la implementació de les funcions d'un mòdul, i volem especificar els prototipus de les funcions públiques, la solució és declarar un fitxer de capçaleres (".H"), que podrem incloure (#include) en els mòduls que vulguin fer servir aquestes funcions. Quan fem l'include dels nostres fitxers Header, hem d'escriure el path del fitxer entre cometes ("") i no entre signes de menor-major (<>), ja que els segons serveixen per buscar els fitxers en els directoris declarats al compilador com a directoris de fitxers de capçalera per defecte (C:\TC\INCLUDE). També podem declarar els nostres directoris com a directoris per defecte.

ex 4.4: El mateix algorisme que abans, però la declaració de prototipus es deixa en el fitxer LONGCAD.H, per a que tots els mòduls que vulguin cridar a la funció strlen() tinguin el prototipus ja declarat:

/* longcad.h */

/* longcad.c */

/* primer.c */

- Cal comentar que de vegades es pot observar que es fan includes de fitxers .C. Aquesta "tècnica" no és compilació separada, ja que s'inclouen els moduls i es compilen tots junts, la qual cosa incrementa el temps de compilació així com la possibilitat de definir llibreries de funcions compartibles entre diferents programes.

cex 4.1: En aquest contraexemple, el fitxer LONGCAD.C és incluit en el fitxer PRIMER.C i es compila tot alhora:

Representació gràfica de la compilació separada, amb fitxers de prototipus :

Representació gràfica de la inclusió d'un fitxer .C:

- Per últim, indicar que els mòduls .OBJ es poden agrupar en llibreries de funcions amb l'aplicació LIB.EXE (o TLIB.EXE). Un exemple són les llibreries estàndard, que podreu observar al directori C:\TC\LIB (estan repetides per a diferents models de compilació CT.LIB, CS.LIB, CC.LIB, CM.LIB, CL.LIB i CH.LIB, que corresponen als models Tiny, Small, Compact, Medium, Large i Huge). També és necessari el codi d'arranc d'aplicació (Startup -> C0T.OBJ, C0S.OBJ, etc.), que el TLINK enllaçarà amb el nostre fitxer .EXE de forma automàtica, per a que la nostra aplicació pugui arrencar.

ex 4.5: Utilitzar la rutina estàndard strlen() per calcular la longitud d'una cadena:

/* primer.c */


Subpunt anterior Subpunt posterior Punt precedent Titol Contingut