So one solution is #define PETSC_NULL 0 #define PETSC_NULL_VARARGS (void*) 0
Drawbacks: ugly, requires user to be aware of vargs calls Advantages: same for C and C++. Barry On Nov 9, 2011, at 3:19 PM, Jed Brown wrote: > On Wed, Nov 9, 2011 at 15:15, Satish Balay <balay at mcs.anl.gov> wrote: > <petscsys.h> > extern void* PETSC_NULL > <init.c> > static void* PETSC_NULL=0L [or null or nullptr - based on configure > determined flags] > > You must not really mean "static". > > > [so as to avoid language/functionality based #def() code in petscsys.h > - that could potentially cause issues like what we had with isinf() > stuff] > > The problem is that C++ does not allow implicit conversion from void* to a > different pointer type. Note how PetscMalloc needs an explicit cast. It is > not possible to write > > int *x = malloc(sizeof(int)); > > in C++, you need > > int *x = (int*)malloc(sizeof(int)); > > If we unconditionally define PETSC_NULL to be (void*)0, then we cannot avoid > requiring the user to make that cast all over the place.
