Skip to content

Macros: Usar ou não usar ?

Agora vou falar de programação. Uma prática no mínimo polêmica é a utilzação de Macros. Mas o que afinal são macros?

Macros são usados no pré-processador usando-se a seguinte sintaxe: “#define APELIDO COISA” . Quando seu código é compilado, toda ocorrência de “APELIDO” é substituído por “COISA“. Um exemplo bem básico seria “#define PI 3.14159265358979323846“, aí vamos supor que queremos calcular PI/2.00 . Ao invés de usarmos (3.14159265358979323846)/2.00, usamos somente PI/2.00 . Fica bem mais claro, não é mesmo?

Pois bem. Muita gente sabe só até aí e não sabe o verdadeiro poder das macros. Vamos supor que você queira fazer a troca de valores de duas variáveis. Se você sabe pouco macro, faria uma função que recebe o endereço das duas variáveis e, usando apontadores, trocaria os valores usando uma variável temporária. Pois bem. Podemos usar uma macro para fazer isso. Como ? “#define EXCHANGE(A,B) {int temp; temp = A; A = B; B = temp;}“. Bem mais simples não é ?

Quer outro exemplo ? Suponha que eu tenha um registro (a.k.a. struct) e quero fazer a impressão deste. Vou supor que esse registro é um ponto do R3. “#define PRINTPOINT(A) printf(”%.4f\t%.4f\t%.4f\n”,A.x, A.y,A.z)”. Legal, não?

Tente pensar em uma Macro para, dados dois inteiros, devolver o máximo, use o operádor ternário para isso (não gosto do operador ternário, mas usar ele numa macro até vai bem já que vou evitar ele no meu código).

Há maus exemplos também. Há como macros substituirem um “for”: “#define FOR(I,N) for(int I = 0 ; I < N ; I++)“. Mas isso não é legal. Simplesmente por você substituir algo e seu código ficar mais confuso (um leigo não entenderia que você anda de um em um). Há macros que fazem todo o trabalho, e isso também não é legal. Macros devem ser curtas e concisas, para você não perder o “fio da miada”. Macros muito grandes podem levar a problemas inesperados.

Meu conselho sobre Macros: Use-os, mas para fazer algo pequeno, rápido e conciso. Nada de fazer macros que fazem muitas coisas (prefira funções).

Post a Comment

Your email is never published nor shared. Required fields are marked *
*
*