So is the only benefit that one does not need the extra characters (void**) 
in front of the argument?

   Doesn't seem like much of a benefit? At this point I think doing it either 
way is fine but if we are inconsistent we should fix some of them to be 
consistent. I am leaning to vote for the (void**) approach; it is clearer when 
one looks at code.


    Barry




On Jun 6, 2011, at 6:40 AM, Jed Brown wrote:

> There are a few places in PETSc where arguments that are logically void** are 
> implemented as void*. This removes the need for the user to provide an 
> explicit cast, and is backward compatible. MPI adopted this convention 
> between version 1.0 and 1.1. For example,
> 
> int MPI_Attr_get(MPI_Comm comm, int keyval,void **attribute_val, int *flag )  
>          /* MPI-1.0 */
> 
> int MPI_Attr_get(MPI_Comm comm, int keyval,void *attribute_val, int *flag )   
>          /* MPI-1.1 and later */
> 
> 
> Inside the implementation, the actual assignment would look something like
> 
> *(void**)attribute_val = comm->attr_table[keyval];
> 
> 
> Should we adopt this uniformly? The benefit is that the user doesn't need to 
> *always* cast to (void**) every time they call the function.
> 
> The downside is that the function signature does not make it obvious that the 
> user should pass the address of their pointer. On the other hand, C 
> pass-by-value semantics guarantee that the function couldn't do anything like 
> what it says if you didn't pass in the address of your pointer.
> 
> 
> Note that this change cannot be made for (void(**)(void)) function arguments 
> because function pointers are not castable to non-function pointers (as per 
> the C standard, though it works on many platforms).


Reply via email to