![]() |
![]() |
![]() |
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 }
![]() |
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.
![]() |
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.
![]() |
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.
![]() |
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
![]() |
![]() |