Universidade Federal d Espírit Sant Centr Tecnlógic Departament de Infrmática Prgramaçã Básica de Cmputadres Prf. Vítr E. Silva Suza Aula 11 Biblitecas de funçã 1. Intrduçã À medida que um prgrama cresce e fica mais cmplex, númer de funções e de linhas de códig em um únic arquiv pde fazer cm que sua cmpreensã e manutençã (adiçã de nvas funções e crreçã de errs) fique mais difícil. Para facilitar, cmpiladr C permite a separaçã d códig em arquivs diferentes, chamads móduls. 2. Separaçã d códig e inclusã Desde tutrial de C vims a diretiva de inclusã presente n códig, para imprtar as funções da bibliteca padrã de perações de entrada e saída (stdi.h): #include <stdi.h> /*... */ As biblitecas padrã d C encntram-se em um diretóri específic que cmpiladr cnhece. A especificar nme d arquiv entre < e >, cmpiladr prcura naquele diretóri; É pssível, prém, especificar uma inclusã a partir d diretóri atual, usand "" a invés de <>. Supnha arquiv prg.c: // Arquiv prg.c #include "minhabib.c" minhafunc(); Para códig acima funcinar, a funçã minhafunc() tem que ser definida n arquiv minhabib.c, que deve se encntrar na mesma pasta d arquiv prg.c: // Arquiv minhabib.c #include <stdi.h> vid minhafunc() { printf("minhafunc() fi chamada!\n"); O cmpiladr trata a inclusã de minhabib.c em prg.c cm se td códig estivesse num arquiv só (n cas, prg.c). Para cmpilar, prtant, basta chamar cmpiladr cm de cstume: gcc - prg prg.c Esse prcess, n entant, pssui algumas falhas. Duas das quais: Qualquer mdificaçã ns arquivs envlvids requer uma recmpilaçã de td códig. Para prgramas muit grandes, iss pde ser um prcess demrad (de minuts a hras); Nã há flexibilidade para substituir uma implementaçã de um cnjunt de funções pr utra diferente.
Universidade Federal d Espírit Sant Centr Tecnlógic Departament de Infrmática Prgramaçã Básica de Cmputadres Prf. Vítr E. Silva Suza 3. Separaçã em móduls É mais recmendad criar um módul, separand a bibliteca de funções em dis arquivs: Arquiv de declarações u arquiv cabeçalh (header) extensã.h: declara as funções existentes naquela bibliteca, prém nã prvê sua implementaçã; Arquiv de definições/implementações u arquiv de códig extensã.c: define a implementaçã de tdas as funções declaradas n arquiv cabeçalh; Cas a bibliteca de funções utilize tips de dads definids pel usuári, estes usualmente sã definids n arquiv cabeçalh. Tant arquiv da bibliteca de funções quant prgrama principal devem imprtar arquiv cabeçalh, para garantir que a funçã implementada na bibliteca e chamada n prgrama seja a mesma (mesm nme, parâmetrs e tip de retrn); Exempl: // Arquiv minhabib.h vid minhafunc(); // Arquiv minhabib.c #include <stdi.h> vid minhafunc() { printf("minhafunc() fi chamada!\n"); // Arquiv prg.c minhafunc(); Neste cas, cm prgrama principal imprta smente cabeçalh e nã cntém a definiçã (implementaçã) da funçã, ele nã pde ser cmpilad szinh. A cmpilaçã se dá em 2 passs: gcc -c minhabib.c gcc - prg prg.c minhabib. A cmpilaçã cm a pçã -c diz a cmpiladr que ali nã existe um prgrama inteir (e, prtant, ele nã prcura pela funçã main()), mas apenas uma bibliteca de funções. O cmpiladr gera um arquiv. (chamad de arquiv bjet) cm mesm nme da bibliteca; Desta maneira, se precisarms mdificar smente prgrama principal, a bibliteca de funções nã terá que ser recmpilada. E se tiverms 100 biblitecas de funçã, se uma delas precisar ser mdificada, smente ela e prgrama principal precisarã ser recmpilads; Se quiserms mudar a implementaçã de minhabib.c para minhabib2.c, se arquiv cabeçalh permanecer mesm, basta trcar s cmands de cmpilaçã. O prgrama principal nã precisará ser alterad;
Universidade Federal d Espírit Sant Centr Tecnlógic Departament de Infrmática Prgramaçã Básica de Cmputadres Prf. Vítr E. Silva Suza 4. Inclusã duplicada e cndições de guarda À medida que prgrama cresce e nvas biblitecas surgem, a rede de dependências entre as biblitecas e prgrama principal fica mais cmplexa; Pde acntecer a seguinte situaçã: // Arquiv utrabib.h typedef struct TMeuTip { int inteir; flat real; char string[100]; *MeuTip; vid utrafunc(meutip param); // Arquiv utrabib.c #include <stdi.h> #include "utrabib.h" vid utrafunc(meutip param) { printf("utrafunca() fi chamada!\n"); // Arquiv minhabib.h vid minhafunc(meutip param); // Arquiv minhabib.c #include <stdi.h> #include "utrabib.h" vid minhafunc(meutip param) { printf("minhafunc() fi chamada!\n"); // Arquiv prg.c #include "utrabib.h" MeuTip var; minhafunc(var); utrafunc(var);
Universidade Federal d Espírit Sant Centr Tecnlógic Departament de Infrmática Prgramaçã Básica de Cmputadres Prf. Vítr E. Silva Suza Nte que prgrama principal inclui cabeçalh de utrabib.h duas vezes, uma diretamente e utra indiretamente (incluir minhabib.h e este inclui utrabib.h); A tentar cmpilar prgrama principal, seguinte err é apresentad: errr: redefinitin f struct TMeuTip errr: redefinitin f typedef MeuTip Para evitar iss, usams cndições de guarda: diretivas d cmpiladr sã adicinadas a arquiv cabeçalh para evitar que ele seja incluíd duas vezes, desta frma: // Arquiv utrabib.h #ifndef OUTRABIB_H #define OUTRABIB_H typedef struct TMeuTip { int inteir; flat real; char string[100]; *MeuTip; vid utrafunc(meutip param); #endif A diretiva #ifndef faz cm que cmpiladr inclua arquiv cabeçalh n pnt nde ele fi chamad smente se a cnstante OUTRABIB_H nã estiver definida; Cas ela realmente nã esteja, a primeira cisa que cabeçalh faz é defini-la, sem valr algum (prém, está definida); Da próxima vez que cabeçalh fr incluíd, #ifndef retrnará fals e códig d cabeçalh nã será adicinad n pnt de inclusã. 5. Cnstruçã de prgramas cm Makefile Também pr cnta d cresciment d númer de biblitecas de funçã, prcess de cnstruçã d prgrama (cmpilaçã ds arquivs) fica mais cmplicad; Uma ferramenta chamada make auxilia na autmaçã d prcess de cnstruçã: all: prg prg: prg.c minhabib.h utrabib.h minhabib. utrabib. gcc - prg prg.c minhabib. utrabib. minhabib.: minhabib.c minhabib.h utrabib.h gcc -c minhabib.c utrabib.: utrabib.c utrabib.h gcc -c utrabib.c clean: rm -rf *. prg
Universidade Federal d Espírit Sant Centr Tecnlógic Departament de Infrmática Prgramaçã Básica de Cmputadres Prf. Vítr E. Silva Suza O arquiv acima chama-se Makefile. Funcina da seguinte maneira: Os terms antes de : sã s alvs. Quand digitams make alv ele prcura alv na lista e executa s cmands; Os terms após : sã as dependências. A tentar prduzir um alv, make tenta primeir satisfazer as dependências, que pdem ser utrs alvs; Abaix da declaraçã ds alvs e dependências estã s cmands. É essencial que cada linha de cmand cmece cm uma tabulaçã; O primeir alv deve sempre ser all, pis é alv padrã. A digitar cmand make, ele cmeçará d alv all. O alv clean também é muit cmum, ele apaga arquivs que sã gerads pel prcess de cnstruçã; Para s demais alvs, utilizams s nmes ds arquivs prduzids a cada pass d prcess de cmpilaçã; Na lista de dependências devems listar s arquivs que sã incluíds cm #include n códig-fnte que está send cmpilad. Desta frma, se um destes arquivs sfrer alteraçã em relaçã à última cmpilaçã, make sabe que deve repetir s cmands daquele alv. D cntrári, ele nã gasta temp a ta; Também devems incluir s arquivs usads n cmand de cmpilaçã (códigs fnte e arquivs bjet) pel mesm mtiv acima (saber quand recmpilar e quand nã precisa). 6. Tips abstrats de dads Utilizar cm base slides d curs rápid de C, a partir d slide 194.