9. O Pré-Processador
O pré-processador é o responsável pela primeira fase da compilação de um programa em C. Nesta fase são processadas todas as linhas começadas pelo caracter #. São várias as directivas de pré-processamento.
Se um programa em C contém a linha
#include FILE
então o pré-processador irá substituir essa linha pelo conteúdo do ficheiro referido por FILE. Isto é feito antes de qualquer compilação. Isto é por vezes usado por ficheiros header contendo definições dos dados usados em ficheiros diferentes. FILE pode ter uma das duas formas:
nome-ficheiro => Ficheiro do utilizador
<nome-ficheiro> => Normalmente ficheiro do compilador.
Na primeira forma o pré-processador primeiro procura o ficheiro no directório corrente, e só depois, caso não o encontre, é que o procura no directório include (directório onde se encontram todas as headers do sistema). Na segunda forma o pré-processador apenas procura o ficheiro no directório include. Como exemplo, um programa poderá começar com as linhas :
#include pilha.h
#include <stdio.h>
#include <ctype.h>
#include <math.h>
que inclui um ficheiro do utilizador e três ficheiros do compilador. O ficheiro do utilizador contém instruções em C, como qualquer outro programa escrito nesta linguagem.
Se um ficheiro contém uma linha da forma
#define nome string
então cada ocorrência do identificador nome no resto do ficheiro irá ser substituída por string. Isto é feito pelo pré-processador antes da compilação.
É um bom estilo de programação usar #define para todas as constantes. É muito mais simples alterar uma linha da forma,
#define SIZE 1024
que modifica correctamente todas as ocorrências de SIZE no ficheiro.
Alguns pontos técnicos sobre o define:
Uma das facilidades da linguagem C consiste em invocar #define com argumentos. Por exemplo,
#define isdigit(c) (0<=^(c)&&(c)<=9)
pode ser usado exactamente como se existisse uma finção que determine quando é que o caracter c é um digito. Outro exemplo é a definição,
#define ABS(x) ((x<0? (-x):(x))
a qual faria com que uma linha da forma
y=ABS(a+b)
fosse substituida (pelo pré-processador antes da compilação ) por
y=( a+b<0 ? -a+b;a+b);
Alguns pontos sobre o uso de #define com argumentos:
#define pode ter vários argumentos:
Em :
#define nome(arg1,arg2,...)
não deverá ser deixado qualquer espaço entre o identificador nome e o parêntises esquerdo.
Os argumentos arg1,... obedecem às mesmas condições dos nomes das variáveis.
O uso abusivo do #define com argumentos pode levar a alguns erros aborrecidos. Notar que a macro anterior ABS tem a vantagem de que trabalhará para variáveis de diferentes tipos. Se uma macro tem uma string de substituição muito longa ou complicada, talvez seja preferível implementá-la como uma função.
|
Back |
Up |
Forward |
|
|
Pages by Nuno Nunes. |
|