I assume you mean something like that:
struct obj_impl {
// real members
...
};
In public API header:
struct obj {
unsigned char _private[N]; // -- where N is the size of obj_impl
};
I have seen such code too. It is also potentially error-prone. Certainly not advocating for it.