I choose "C - none of the above."
Although this is not a direct answer to the question you asked, the correct solution to the situation seems quite simple and obvious to me: you should not use any of the above.
At least IMO, you really have a reason to do otherwise, your function should accept void * or (preferably) void const * . What you are looking for is basically an opaque pointer, and exactly what void * provides. The user does not need to know anything about the internal components of your implementation, and since any other type of pointer will implicitly convert to void * , this is one of the few features that also does not violate existing code.
source share