#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:
Seu código fonte deve estar preparado, fazendo testes sobre macros especiais e se adaptando à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 oconfigure. 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.
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)