[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