Capítulo 13 - O Pré-Processador do C


Conteúdo Capítulo anterior Capítulo seguinte
O pré-processamento é a primeira fase da compilação de um programa em C.  O pré-processador manipula apenas o texto do programa fonte servindo-se de uma linguagem própria bastante poderosa que pode vir a tornar-se muito útil para o programador.  Todas as directivas ou comandos do pré-processador começam com o carácter #.

As principal vantagem da utilização do pré-processador é a possibilidade de tornar os programas:

O pré-processador também nos permite customizar a linguagem.  Por exemplo se quisermos usar como delimitadores de uma instrução composta as palavras begin e end do PASCAL basta incluir no início do programa as seguintes directivas do pré-processador:
#define begin {
#define end }

Tópicos



#define

Esta diretiva é usada para definir constantes ou substituições mais poderosas denominadas macros.  A sintaxe geral é a seguinte:
#define nome texto_de_definição
Por exemplo:
#define FALSE 0
#define TRUE !FALSE
É possivel definir também pequenas "funções" com parâmetros (macros) cujas "chamadas" no texto do programa são substituídas pelo texto_de_definição com os parâmetros também substituídos. Por exemplo, seria possível definir uma macro max que nos dá o máximo de duas expressões:
#define max(A, B) ((A) > (B) ? (A) : (B))
Note-se que esta directiva não define uma verdadeira função do C, mas apenas uma subsituição de texto com o aspecto de uma chamada a função. Assim quando pré-processador encontra no texto do programa qualquer coisa como:
x = max(r+s, s+t);
esta linha de texto é substituída por outra linha de texto, igual a:
x = ((r+s) > (s+t) ? (r+s) : (s+t));
Outro exemplo:
#define Deg_to_Rad(x) (x * M_PI / 180.0)
M_PI é uma constante contendo o valor de pi que está definida no arquivo de inclusão da biblioteca standard math.h.
 
Up

#undef

Este comando, com a forma #undef nome, indefine qualquer prévia definição de nome. Para se poder redefinir um nome numa outra directiva #define, é necessáriro indefini-lo primeiro.
 
Up

#include

Esta diretiva lê um arquivo de texto e inclui o seu conteúdo no local da diretiva.  Tem duas formas possíveis:

#include <nome_de_arquivo>

ou

#include "nome_de_arquivo"

A forma <...> indica que o arquivo a incluir deve ser procurado num diretório pré-definido onde se encontram os arquivos de inclusão da biblioteca standard. Por exemplo, no UNIX, esse diretório é /usr/include.

A forma "..." procura o arquivo a incluir no diretório corrente.

Estes arquivos de inclusão contêm geralmente declarações de variáveis, tipos, constantes ou protótipos de funções e nunca instruções executáveis.
 
Up


#if - inclusão condicional

A diretiva #if avalia uma expressão inteira e executa uma ação baseada no resultado (interpretado como TRUE ou FALSE).  Esta diretiva é sempre terminada com a palavra #endif.  Entre a diretiva #if e #endif poderá haver ainda as diretivas #else (com o significado habitual) e #elif (significando else if). Esta última permite contruir condições aninhadas.

Outras formas da diretiva #if são:

#ifdef nome - que verifica se nome foi previamente definido numa diretiva #define, e
#ifndef nome - que verifica se o nome ainda não foi definido anteriormente.

Por exemplo, para definir uma constante que contenha o número de bits de um inteiro, que possa ser compilado correctamente em Ms-Dos no compilador Turbo C e no UNIX, poderiamos pôr no programa as seguintes directivas:

#ifdef TURBOC
     #define INT_SIZE 16
#else
     #define INT_SIZE 32
#endif
Outro exemplo:
#if SYSTEM == MSDOS
     #include <msdos.h>
#else
     #include "default.h"
#endif
Up

Exercícios

1. Defina uma macro do pré-processador swap(t, x, y) que troque dois argumentos x e y de um tipo t.
 
Up


[REV 10/98]