("Programa versao %s",VERSAO);printf ("O numero pi vale: %f",PI);return 0;}Se quisermos mudar o nosso valor de PI, ou da VERSAO, no programa acima, bastamexer no inicio do programa. Isto torna o programa mais flexivel. Ha quem diga que, em umprograma, nunca se deve usar constantes como 10, 3.1416, etc., pois estes sao numeros queninguem sabe o que significam (muitas pessoas os chamam de "numeros magicos"). Ao invesdisto, deve-se usar apenas #defines. E uma convencao de programacao (que deve serseguida, pois torna o programa mais legivel) na linguagem C que as macros declaradas em#defines devem ser todas em maiusculas.Um outro uso da diretiva #define e o de simplesmente definir uma macro. Neste casousa-se a seguinte forma geral:#define nome_da_macroNeste caso o objetivo nao e usar a macro no programa (pois ela seria substituida pornada), mas, sim, definir uma macro para ser usada como uma especie de flag. Isto quer dizerque estamos definindo um valor como sendo "verdadeiro" para depois podermos testa-lo.Tambem e possivel 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 pareca uma chamada de funcao, o uso de max (ou min) simplesmente substitui,em tempo de compilacao, o codigo especificado. Cada ocorrencia de um parametro formal (Aou B, na definicao) sera substituido pelo argumento real correspondente. Assim, a linha decodigo:x = max(i,j);sera substituida pela linha:x = ((i)>(j) ? (i):(j));A linha de codigo:x = max(p+q,r+s);sera substituida pela linha:67x = ((p+q)>(r+s) ? (p+q):(r+s));Isto pode ser muito util. Verifique que as macros max e min nao possuem especificacaode tipo. Logo, elas trabalham corretamente para qualquer tipo de dado, enquanto osargumentos passados forem coerentes. Mas isto pode trazer tambem algumas armadilhas.Veja que a linhax = max(p++,r++);sera substituida pelo codigox = ((p++)>(r++) ? (p++):(r++));e em consequencia, incrementara o maior valor duas vezes.Outra armadilha em macros esta relacionada com o uso de parenteses. Seja a macro:#define SQR(X) X*XImagine que voce utilize esta macro na expressao abaixo:y = SQR(A+B);Ao fazer isto, a substituicao que sera efetuada nao estara correta. A expressao geradasera:y = A+B*A+B;que obviamente e diferente de (A+B)*(A+B) !A solucao para este problema e incluir parenteses na definicao da macro:#define SQR(X)(X)*(X)Quando voce utiliza a diretiva #define nunca deve haver espacos em branco noidentificador. Por exemplo, a macro:#define PRINT (i) printf(" %d \n", i)nao funcionara corretamente porque existe um espaco em branco entre PRINT e (i). Aose tirar o espaco, a macro funcionara corretamente e podera ser utilizada para imprimir onumero inteiro i, saltando em seguida para a proxima linha.A diretiva #undef tem a seguinte forma geral:#undef nome_da_macroEla faz com que a macro que a segue seja apagada da tabela interna que guarda asmacros.O compilador passa a partir deste ponto a nao conhecer mais esta macro.AUTO AVALIACAO68Veja como voce esta: Escreva uma macro que retorne 1 se o seu argumento for umnumero impar e 0 se for um numero par.As Diretivas ifdef e endifNesta secao, e ate mais a frente, veremos as diretivas de compilacao condicional. Elassao muito parecidas com os comandos de execucao condicional do C. As duas primeirasdiretivas que veremos sao as #ifdef e #endif. Suas formas