Since google declared calorically that one cannot do this in C and I refuse to have #if !defined(PETSCDRAWLGTYPEDEFED) typedef struct xxx #define PETSCDRAWLGTYPEDEFED) #endif scattered around I put the typedef of PetscDrawLG into petscys.h then small changes were made to the following files
M include/petsc-private/drawimpl.h M include/petscdraw.h M include/petscsys.h M src/dm/impls/composite/pack.c M src/dm/impls/da/da1.c M src/dm/impls/da/da2.c M src/dm/impls/da/da3.c M src/dm/impls/da/gr1.c M src/dm/impls/da/gr2.c M src/ksp/ksp/interface/eige.c M src/ksp/ksp/interface/itcreate.c M src/ksp/ksp/interface/itfunc.c M src/ksp/ksp/interface/xmon.c M src/ksp/pc/impls/bjacobi/bjacobi.c M src/ksp/pc/impls/fieldsplit/fieldsplit.c M src/ksp/pc/impls/mg/mg.c M src/ksp/pc/interface/precon.c M src/mat/impls/aij/mpi/mpiaij.c M src/mat/impls/aij/seq/aij.c M src/mat/impls/baij/mpi/mpibaij.c M src/mat/impls/baij/seq/baij.c M src/mat/impls/dense/mpi/mpidense.c M src/mat/impls/dense/seq/dense.c M src/mat/impls/sbaij/mpi/mpisbaij.c M src/mat/impls/sbaij/seq/sbaij.c M src/mat/matfd/fdmatrix.c M src/snes/impls/fas/fas.c M src/snes/interface/snes.c M src/sys/classes/draw/impls/x/ftn-custom/zdrawopenxf.c M src/sys/classes/draw/interface/ftn-custom/zdrawf.c M src/sys/classes/draw/interface/ftn-custom/zdrawregf.c M src/sys/classes/draw/interface/ftn-custom/zdtextf.c M src/sys/classes/draw/interface/ftn-custom/zdtextvf.c M src/sys/classes/draw/interface/ftn-custom/zdtrif.c M src/sys/classes/draw/utils/axis.c M src/sys/classes/draw/utils/axisc.c M src/sys/classes/draw/utils/axisimpl.h M src/sys/classes/draw/utils/dscatter.c M src/sys/classes/draw/utils/ftn-custom/zaxisf.c M src/sys/classes/draw/utils/ftn-custom/zzoomf.c M src/sys/classes/draw/utils/hists.c M src/sys/classes/draw/utils/lg.c M src/sys/classes/draw/utils/lgc.c M src/sys/classes/draw/utils/lgimpl.h M src/sys/classes/viewer/impls/draw/vdraw.h M src/ts/interface/ts.c M src/ts/interface/tseig.c M src/vec/vec/impls/mpi/pdvec.c M src/vec/vec/impls/seq/bvec2.c M src/vec/vec/utils/cmesh.c I'm fine with doing this. Is there a better solution? Barry On Feb 15, 2013, at 12:38 PM, Barry Smith <bsmith at mcs.anl.gov> wrote: > > How does one prevent this problem? > > [ 15%] Building C object CMakeFiles/petsc.dir/src/ksp/pc/impls/is/nn/nn.c.o > In file included from > /Users/barrysmith/Src/petsc-dev/src/ksp/pc/impls/bjacobi/bjacobi.c:184: > /Users/barrysmith/Src/petsc-dev/include/petscdraw.h:283: error: redefinition > of typedef ?PetscDrawLG? > /Users/barrysmith/Src/petsc-dev/include/petscksp.h:598: error: previous > declaration of ?PetscDrawLG? was here > > > On Feb 15, 2013, at 11:28 AM, Jed Brown <jedbrown at mcs.anl.gov> wrote: > >> We currently use recursive includes everywhere, so petscdmda.h includes all >> of petscao.h just so it can declare DMDAGetAO and similar. Of course most >> users of (and implementation files in) DMDA do not reference AO so they >> don't need to know about all the AO functions. >> >> The normal approach to this is to forward-declare the type, so instead of >> >> #include <petscao.h> /* includes lots of other stuff */ >> PETSC_EXTERN PetscErrorCode DMDAGetAO(DM,AO*); >> >> one would write >> >> typedef struct _p_AO *AO; >> PETSC_EXTERN PetscErrorCode DMDAGetAO(DM,AO*); >> >> in which case all three files in PETSc that actually call AO routines would >> need to include petscao.h. That is arguably a good thing since it makes the >> actual dependencies more explicit, and is recommended by many (mostly C++) >> style guidelines. >> >> Is this something worth considering? I think stuff like petscvec.h and >> petscmat.h ends up pretty much always being needed, but petscdm.h is only >> used by a handful of files in petscksp and above, for example. >> >> It might be nice to get rarely-used stuff like petscdraw.h out of petscsys.h. >
