I choose "C -- none of the above."
Although it's not a direct answer to the question you actually asked, the right solution to the situation seems fairly simple and obvious to me: you shouldn't really be using any of the above.
At least IMO, you have a really good reason to do otherwise, your function should accept a void *
or (preferably) void const *
. What you're looking for is basically an opaque pointer, and that's exactly what void *
provides. The user doesn't need to know anything about the internals of your implementation, and since any other pointer type will convert to void *
implicitly, it's one of the few possibilities that doesn't break any existing code either.