11.1 Macros
São diretivas do pré-processamento que permitem substituir porções de
código antes da compilação. As instruções do pré-processamento são
seguidas do operador #.
- #define cod exp substitui o cod por verb.
- #include <cod.h> inclui o código da biblioteca cod.h. Essa sintaxe
vale para as biliotecas padrão.
- #include "home/fulano/aula/cod.h" inclui o código da biblioteca
cod.h. Essa sintaxe vale para bibliotecas próprias salva com o nome
cod.h na pasta home/fulano/aula/.
Exemplo 11.1.1. Implemente uma biblioteca com uma função que troca
x e y.
Salvamos um arquivo com nome lib.h com as seguintes linhas:
//lib.h
void troca(double *a,double *b)
{
double aux;
aux=*a;
*a=*b;
*b=aux;
}
Depois, salvamos um arquivo com o nome teste.c com as linhas:
#include <stdio.h>
#include <stdlib.h>
#include "lib.h"
#define Mult(x,y) (x)*(y)
void main (int argc,char **argv)
{
if (argc!=3)
{
printf("Digite dois números\n");
return;
}
double x=atof(argv[1]);
double y=atof(argv[2]);
printf("x=%f, y=%f, xy=%f\n",x,y,Mult(x,y));
troca(&x,&y);
printf("x=%f, y=%f, xy=%f\n",x,y,Mult(x,y));
}
Exemplo 11.1.2. Várias implementações da função mínimos entre
dois números.
Primeiro implementamos um a biblioteca com três tipos de função
mínimo:
//salva como lib.h
double Min1(double a,double b)
{
if (a<b) return a;
else return b;
}
void Min2(double *a,double b)
{
if (b<*a) *a=b;
}
double Min3(double a,double b)
{
return a<b?a:b;
}
Depois, implementamos um código que inclui a primeira biblioteca:
#include <stdio.h>
#include <stdlib.h>
#include "lib.h"
#define Min4(a,b) ((a)<(b))?(a):(b)
void main (int argc,char **argv)
{
double x=2,y=3;
printf("Min1(%f,%f)=%f\n",x,y,Min1(x,y));
printf("Min3(%f,%f)=%f\n",x,y,Min3(x,y));
printf("Min4(%f,%f)=%f\n",x,y,Min4(x,y));
Min2(&x,y);
printf("Min4=%f\n",x);
}
Observe a funcionamento da linha return a<b?a:b; na função Min3. Essa é
uma forma de escrever a condição
if (a<b) return a;
else return b;
A expressão a<b?a:b devolve o valor do teste: Se (a<b) devolve a, senão
devolve b. O macro #define Min4(a,b) ((a)<(b))?(a):(b) também calcula o
mínimo entre a e b. Um macro está escrito em uma única linha que inicia com
#. Se a expressão for muito grande e você precisar de duas linhas, use o
operador continuidade \:
#define Min4(a,b) ((a)<(b))?\
(a):\
(b)