#define quad(X) X*X
quad(3)
quad(a+b)
� expandido como
3*3
a+b*a+b
O mais correto seria
#define quad(X) (X)*(X)
mas mesmo assim existem proplemas como quad(d++)
define(`foo', `Hello world.')
define(`troca', `$2, $1')
define(`eu', `Este sou `eu'.')
foo
troca(papai,oi)
eu
Alguns macros e comandos especiais (obs.: � fundamental que o ( venha grudado no nome da macro)
Seu c�digo-fonte deve estar preparado, fazendo testes sobre macros especiais e adaptando-se �s diversas situa��es de um modo padronizado.
Voc� tamb�m precisar� do Mafekile.in, um makefile com macros, que ser� transformado no Makefile final, na hora de compilar.
O processo � mais ou menos o seguinte:
Feito isso, os seus fontes, mais o configure, o Makefile.in e o config.h.in formam o conjunto do programa.
Na m�quina final, rode o configure. Ele far� todos
os testes necess�rios e arrumar� o Makefile.in e o config.h.in,
construindo o Makefile e o config.h finais. O config.h
essencialmente conter� os macros que devem ser testados pelos seus
programas.
Mais documenta��o
CFLAGS=-Wall -g @CFLAGS@
@XPMTEST@
all : teste teste2 teste3
teste2 : teste2.o xwc.o
${CC} ${CFLAGS} -o teste2
teste2.o xwc.o @LDFLAGS@ @LIBS@
ifndef NOXPM
teste3 : teste3.o xwc.o
${CC} ${CFLAGS} -o teste3
teste3.o xwc.o @LDFLAGS@ @LIBS@
else
teste3 :
echo Este programa s�
funciona com a biblioteca Xpm instalada
endif
teste : teste.o xwc.o
${CC} ${CFLAGS} -o teste
teste.o xwc.o @LDFLAGS@ @LIBS@
xwc.o : xwc.c
clean:
rm -f *.o teste teste2
teste3 *~ Nose.xpm Tutti.xpm caca
Uma parte do xwc usa a biblioteca Xpm para manipular algumas
imagens. No entanto, mesmo que esta biblioteca n�o esteja
presente, � poss�vel usar o resto das rotinas. O macro
NOXPM indicar� se a biblioteca n�o foi encontrada.
@XPMTEST@ ser� substitu�da por uma cadeia vazia ou pela defini��o
de NOXPM, conforme o caso.
O autoscan gerou o seguinte configure.scan:
dnl Process this file with autoconf to produce a configure script.
AC_INIT(teste.c)
dnl Checks for programs.
dnl Checks for libraries.
dnl Replace `main' with a function in -lX11:
AC_CHECK_LIB(X11, main)
dnl Replace `main' with a function in -lXpm:
AC_CHECK_LIB(Xpm, main)
dnl Replace `main' with a function in -lm:
AC_CHECK_LIB(m, main)
dnl Checks for header files.
AC_PATH_X
AC_HEADER_STDC
AC_CHECK_HEADERS(unistd.h)
dnl Checks for typedefs, structures, and compiler characteristics.
dnl Checks for library functions.
AC_OUTPUT(Makefile)
Mas, para o teste das bibliotecas X funcionarem, os diret�rios
de include e de bibliotecas j� devem estar atualizados.
Assim, o configure.scan teve de ser editado e sua vers�o
final (configure.in) ficou assim (os coment�rios do Gubi est�o
em portugu�s):
dnl -*- mode:m4 -*-
dnl Process this file with autoconf to produce a configure script.
AC_INIT(teste.c)
dnl Checks for programs.
dnl S� para completar
AC_PROG_CC
dnl Checks for libraries.
dnl Precisamos do X, este macro define x_libraries e x_includes,
os
dnl diret�rios procurados
AC_PATH_X
dnl Ajustando as op��es de compila��o
LDFLAGS="-L${x_libraries} $LDFLAGS"
CFLAGS="-I${x_includes} $CFLAGS"
dnl Replace `main' with a function in -lX11:
dnl Xflush � uma das fun��es usadas
AC_CHECK_LIB(X11, XFlush)
dnl Replace `main' with a function in -lXpm:
dnl XpmReadFileToPixmap � outra. Veja que neste macro
as a��es s�o
dnl diferentes do default.
AC_CHECK_LIB(Xpm, XpmReadFileToPixmap,,
echo N�o ser� poss�vel usar as fun��es
da biblioteca Xpm
XPMTEST="NOXPM=1"
CFLAGS="-D NOXPM $CFLAGS"
)
dnl acertamos @XPMTEST@ no Makefile.in
AC_SUBST(XPMTEST)
dnl Replace `main' with a function in -lm:
dnl usamos o c�lculo de tangentes, no teste.c
AC_CHECK_LIB(m, tan)
dnl Checks for header files.
AC_HEADER_STDC
AC_CHECK_HEADERS(unistd.h)
dnl Checks for typedefs, structures, and compiler characteristics.
dnl Checks for library functions.
AC_OUTPUT(Makefile)