By now, of course, precompiled headers exist, but their interplay with #define allows for fun inconsistencies.
And, of course, they leak implementation as much as the author wants, all the way to .h-only single-file libraries.
If you want an example of a sane approach to separate interface and implementation files from last century, take a look e.g. at Modula-2 with its .int and .mod files.