I'm sure this article is useful and interesting, but the author lost me at the very first example program, where he wrote `@px++` instead of `(@px)++` (@ stands for asterix character).
The proper way is not exporting implementation details at all, instead define opaque types in your header files like this: `typedef struct ssl_st SSL;`. This comes from OpenSSL, it means users can use `SSL *` pointers, but they don't know what those pointers point to.
Of course you can also have internal header-files within your own project, which you don't share with the end-users of your product.
It is perfectly valid to use more than one header files: some of them can be public (meant to be seen by users of your library), others can be private or internal (only used by your own sources).