9. O Pré-Processador

9.1 Introdução

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.

9.2 Include

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.

9.3 Define

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:

- A string inclui todos os caracteres (incluindo o espaço branco) até encontrar o caracter newline.
- o nome segue exactamente as regras dos nomes das variáveis.
- Uma convenção standard é usar nome em maiusculas para se distinguir as macros das variáveis vulgares.
- Não são possíveis substituições nas strings, isto é, vendo no fragmento,
  #define SIM 1
  printf (SIM=%d\n,SIM);
  o pré-processador só faz uma substituição.
- A string no define pode ser superior a uma linha; para isso o caracter newline terá de ser precedido pelo caracter \ Barra Invertida (backslash).

9.4 Define com argumentos

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

To front page | Pages by Nuno Nunes. |