[ovs-dev] [tests+nxm-ofctl 28/42] util: Improve type-safety of OBJECT_CONTAINING.

Justin Pettit jpettit at nicira.com
Fri Dec 3 02:48:08 UTC 2010


On Nov 23, 2010, at 2:44 PM, Ben Pfaff wrote:

> +/* Given a pointer-typed lvalue OBJECT, expands to a pointer type that may be
> + * assigned to OBJECT. */
> +#ifdef __GNUC__
> +#define OVS_TYPEOF(OBJECT) typeof(OBJECT)
> +#else
> +#define OVS_TYPEOF(OBJECT) void *
> +#endif
> +
> /* Given POINTER, the address of the given MEMBER in a STRUCT object, returns
>    the STRUCT object. */
> #define CONTAINER_OF(POINTER, STRUCT, MEMBER)                           \
>         ((STRUCT *) (void *) ((char *) (POINTER) - offsetof (STRUCT, MEMBER)))
> 
> /* Given POINTER, the address of the given MEMBER within an object of the type
> - * that that OBJECT points to, returns OBJECT as a "void *" pointer.  OBJECT
> - * must be an lvalue.
> + * that that OBJECT points to, returns OBJECT as an assignment-compatible
> + * pointer type (either the correct pointer type or "void *").  OBJECT must be
> + * an lvalue.
>  *
>  * This is the same as CONTAINER_OF except that it infers the structure type
>  * from the type of '*OBJECT'. */
> #define OBJECT_CONTAINING(POINTER, OBJECT, MEMBER)                      \
> -        ((void *) ((char *) (POINTER)                                   \
> -                   - ((char *) &(OBJECT)->MEMBER - (char *) (OBJECT))))
> +    ((OVS_TYPEOF(OBJECT)) (void *)                                      \
> +     ((char *) (POINTER) - ((char *) &(OBJECT)->MEMBER - (char *) (OBJECT))))

Did you want "((OVS_TYPEOF(OBJECT)) (void *)"?  I would have thought it wouldn't have that (void *) in it anymore.

--Justin






More information about the dev mailing list