CURSO DE C
A diretiva #define tem a seguinte forma geral:
#define nome_da_macro sequência_de_caracteres
Quando você usa esta diretiva, você está dizendo ao compilador para que, toda vez que ele encontrar o nome-da- macro no programa a ser compilado, ele deve substituí-lo pela sequência de caracteres fornecida. Isto é muito útil para deixar o programa mais geral. Veja um exemplo:
#include <stdio.h> #define PI 3.1416 #define VERSAO "2.02" main () { printf ("Programa versao %s",VERSAO); printf ("O numero pi vale: %f",PI); }
Se quisermos mudar o nosso valor de PI, ou da VERSAO, no programa acima, basta mexer no início do programa. Isto torna o programa mais flexível. Há quem diga que, em um programa, nunca se deve usar constantes como 10, 3.1416, etc., pois estes são números que ninguém sabe o que significam. Ao invés disto deve-se usar apenas #defines. É uma convenção na linguagem C que as macros declaradas em #defines devem ser todas em maiúsculas. Esta é uma convenção que deve ser seguida pois torna o programa mais legível.
Um outro uso da diretiva #define é o de simplesmente definir uma macro. Neste caso usa-se a seguinte forma geral:
#define nome_da_macro
Neste caso o objetivo não é usar a macro no programa (pois ela seria substituída por nada), mas, sim, definir uma macro para ser usada como uma espécie de flag. Isto quer dizer que estamos definindo um valor como sendo "verdadeiro" para depois podermos testá-lo.
Também é possível definir macros com argumentos. Veja o exemplo a seguir:
#define max(A,B) ((A>B) ? (A):(B)) #define min(A,B) ((A<B) ? (A):(B)) ... x = max(i,j); y = min(t,r);
Embora pareça uma chamada de função, o uso de max (ou min) simplesmente substitui, em tempo de compilação, o código especificado. Cada ocorrência de um parâmetro formal (A ou B, na definição) será substituído pelo argumento real correspondente. Assim, a linha de código
x = max(p+q,r+s);
será substituída pela linha:
x = ((p+q)>(r+s) ? (p+q):(r+s));
Isto pode ser muito útil. Verifique que as macros max e min não possuem especificação de tipo. Logo, elas trabalham corretamente para qualquer tipo de dado, enquanto os argumentos passados forem coerentes. Mas isto pode trazer também algumas armadilhas. Veja que a linha
x = max(p++,r++);
será substituída pelo código
x = ((p++)>(r++) ? (p++):(r++));
e em consequência, incrementará o maior valor duas vezes.
A diretiva #undef tem a seguinte forma geral:
#undef nome_da_macro
Ela faz com que a macro que a segue seja apagada da tabela interna do compilador que guarda as macros. É como se o compilador não conhecesse mais esta macro.