[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