[petsc-dev] Forward declarations of types?

Matthew Knepley knepley at gmail.com
Fri Feb 15 12:17:07 CST 2013


On Feb 15, 2013 1:01 PM, "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.

We do this in PyLith. I like it. We need to do it in the same place in
every header, with a structured comment. Should we remove the forward
declaration if we end up including the full header later?

   Matt

> It might be nice to get rarely-used stuff like petscdraw.h out of
petscsys.h.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.mcs.anl.gov/pipermail/petsc-dev/attachments/20130215/63ac197e/attachment.html>


More information about the petsc-dev mailing list