Contents

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


botões
botões 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 diretivas ou comandos do pré-processador começam com o caractere #.

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

O pré-processador também permitem-nos personalizar 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 diretivas do pré-processador:

  #define begin {
  #define end }

Tópicos

setas
setas Up

#define

Esta diretiva é usada para definir constantes ou substituições mais poderosas denominadas macros. A sintaxe é a seguinte:

  #define nome texto_de_definição

Por exemplo:

  #define FALSE 0
  #define TRUE !FALSE

É possível 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 diretiva não define uma verdadeira função do C, mas apenas uma substituição de texto com o aspeto de uma chamada a função. Assim quando pré-processador encontra no texto: x = max(r+s, s+t); esta 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 ficheiro de inclusão da biblioteca standard math.h.

setas
setas Up

#undef

Este comando, com a forma #undef nome, não define qualquer prévia definição de nome. Para se poder redefinir um nome numa outra diretiva #define, é necessário defini-la primeiro.

setas
setas Up

#include

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

  #include <nome_de_ficheiro>

ou

  #include "nome_de_ficheiro"

A forma <...> indica que o ficheiro a incluir deve ser procurado num diretório pré-definido onde se encontram os ficheiros de inclusão da biblioteca standard.

Por exemplo, no UNIX, esse diretório é /usr/include.

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

Estes ficheiros de inclusão contêm geralmente declarações de variáveis, de tipos, constantes ou protótipos de funções.

setas
setas 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 construir condições aninhadas.

Outras formas da diretiva #if são:

#ifdef nome verifica se nome foi previamente definido numa diretiva #define e #ifndef nome 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 corretamente em MS-DOS no compilador Turbo C e no UNIX, poderíamos pôr no programa as seguintes diretivas:

  #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
setas
setas 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.
setas
setas Up