[petsc-dev] Problem with PETSC_NULL and variadic functions
Barry Smith
bsmith at mcs.anl.gov
Wed Nov 9 15:27:21 CST 2011
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.
More information about the petsc-dev
mailing list