/* Stripped-down API equivalent */ typedef struct object object; typedef int errcode; extern errcode SetUserContext(object* obj, void* user_context); extern errcode GetUserContext(object* obj, void** user_context); /* API-using code */ typedef struct my_user_context my_user_context; extern my_user_context* AllocMyUserContext(void); void my_set_func(object* the_object) { my_user_context* uc; errcode err; uc = AllocMyUserContext(); err = SetUserContext(the_object, (void*)uc); } void my_get_func(object* the_object) { my_user_context* uc; errcode err; /* Breaks strict aliasing rules? */ err = GetUserContext(the_object, (void**)&uc); } void my_get_func2(object* the_object) { my_user_context* uc; void* uc_v; errcode err; err = GetUserContext(the_object, &uc_v); uc = uc_v; }