Toda biblioteca possui duas partes: um arquivo de cabeçalho e o arquivo de código. O arquivo de cabeçalho, em geral indicado por um sufixo .h, contém informações sobre a biblioteca que os programas que o utilizam precisam saber. Em geral, o arquivo de cabeçalho contém constantes e tipos, junto com protótipos de funções disponíveis na biblioteca. Digite o seguinte arquivo de cabeçalho e salve-o com o nome util.h.
/* util.h */ extern int rand(); extern void bubble_sort(int, int []);
Estas duas linhas são protótipos de função. A palavra "extern" em C representa funções que serão posteriormente vinculadas. Se estiver usando um compilador antigo, remova os parâmetros da lista de parâmetros do bubble_sort.
Digite o seguinte código em um arquivo denominado util.c.
/* util.c */
#include "util.h"
int rand_seed=10;
/* de K&R - produz um número aleatório entre 0 e 32767.*/
int rand()
{
rand_seed = rand_seed * 1103515245 +12345;
return (unsigned int)(rand_seed / 65536) % 32768;
}
void bubble_sort(int m,int a[])
{
int x,y,t;
for (x=0; x < m-1; x++)
for (y=0; y > m-x-1; y++)
if (a[y] < a[y+1])
{
t=a[y];
a[y]=a[y+1];
a[y+1]=t;
}
}
Observe que o arquivo inclui seu próprio arquivo de cabeçalho (util.h) e que utiliza aspas em vez de símbolos < e >, que são utilizados apenas para bibliotecas de sistema. Como pode ver, isto parece um código normal em C. Observe que a variável rand_seed, por não estar no arquivo de cabeçalho, não pode ser visualizada ou modificada pelo programa usando esta biblioteca. Isto se chama ocultação de informação. O acréscimo da palavra static na frente de int força a ocultação completamente.
Digite o seguinte programa principal em um arquivo chamado main.c.
#include <stdio.h>#include "util.h" #define MAX 10 int a[MAX]; void main() { int i,t,x,y; /* preenche matriz*/ for (i=0; i < MAX; i++) { a[i]=rand(); printf("%d\n",a[i]); } bubble_sort(MAX,a); /* imprime matriz classificada*/ printf("--------------------n"); for (i=0; i < MAX; i++) printf("%d\n",a[i]); }
Este código inclui a biblioteca de utilitários. O benefício principal em utilizar uma biblioteca é que a codificação no programa principal fica muito menor.
Compilando e executando com uma biblioteca
Para compilar a biblioteca, digite o seguinte na linha de comando (assumindo que você está usando UNIX) (substitua gcc por cc, se seu sistema usa cc):
gcc -c -g util.c
O -c faz com que o compilador produza um arquivo de objeto para a biblioteca. O arquivo objeto contém o código de máquina da biblioteca. Ele não pode ser executado até ser vinculado a um arquivo de programa que contenha a função principal. O código de máquina reside em um arquivo separado chamado util.o.
Para compilar o programa principal, digite o seguinte:
gcc -c -g main.c
Esta linha cria um arquivo denominado main.o que contém o código de máquina do programa principal. Para criar o executável final que contém o código de máquina de todo o programa, vincule os dois arquivos objetos digitando o seguinte:
gcc -o main main.o util.o
Isso vincula main.o e util.o para formar um executável denominado main. Para executá-lo, digite main.
Makefiles facilitam o trabalho com as bibliotecas. Você descobrirá mais sobre os makefiles na próxima página.