Quoting "Joseph S. Myers" <[email protected]>:
You can perfectly well do type safety without using void *.
struct cumulative_args;
type hook(struct cumulative_args *arg);
static inline struct x86_cumulative_args *
x86_get_cumulative_args (struct cumulative_args *arg)
{struct cumulative_args *
return (struct x86_cumulative_args *) arg;
}
But then you run into implementation-defined behaviour for the casts from/to
struct cumulative_args * . E.g. an implementation could decide to chop
off some bits at the bottom because struct cumulative_args is supposed to
have extra alignment because of the members it contains - or because of an
md5hash hash collision with the name of the developer's favourite pet.
(Properly documented, of course.)
how about:
typedef struct
{
void *p;
} cumulative_args_t;
or maybe for more efficiency:
#ifdef __GNUC__
#define ATTRIBUTE_TRANSPARENT_UNION __attribute__((transparent_union))
#else
#define ATTRIBUTE_TRANSPARENT_UNION
#endif
typedef union ATTRIBUTE_TRANSPARENT_UNION { void *p; } cumulative_args_t;
static inline struct x86_cumulative_args *
x86_get_cumulative_args (cumulative_args_t arg)
{
return (struct x86_cumulative_args *) arg.p;
}