| ▲ | kccqzy 3 hours ago | |
> No sane programming language should require a duplication in order to export something (for example, the full function and its prototype) You are spoiled by the explosive growth of open source and the ease of accessing source code. Lots of closed source commercial libraries provide some .h files and a .so file. And even when open source, when you install a library from a package from a distribution or just a tarball, it usually installs some .h files and a .so file. The separation between interface and implementation into separate files was a good idea. The idea seemed to be going out of vogue but it’s still a good idea. | ||
| ▲ | senfiaj 2 hours ago | parent | next [-] | |
> Lots of closed source commercial libraries provide some .h files and a .so file. I'm mostly talking about modules for internal implementation, which is likely to be the bulk of the exports. Yes, it's understandable that for dll / so files exporting something for external executables is more complicated also because of ABI compatibility concerns (we use things like extern "C"). So, yes header approach might be justified in this case, but as I stated, such exports are probably a fraction of all exports (if they are needed at all). I'll still prefer modules when it's possible to avoid them. | ||
| ▲ | AgentME 2 hours ago | parent | prev | next [-] | |
In most situations, auto-generating the equivalent of .h files for a library based on export statements in the source code would be fine and a useful simplification. | ||
| ▲ | johannes1234321 2 hours ago | parent | prev [-] | |
> The separation between interface and implementation into separate files was a good idea. The idea seemed to be going out of vogue but it’s still a good idea. However as soon as you do C++ that goes away. With C++ you need implementation of templates available to the consumer (except cases with limited set of types where you can extern them), wmin many cases you get many small functions (basic operator implementations, begin()/end() for iterators in all variations etc.) which benefit from inking, thus need to be in the header. Oh and did I mention class declarations tonthe the class size ... or more generic and even with plain C: As soon as the client should know about the size of a type (for being able to allocate it, have an array of those etc) you can't provide the size by itself, but you have to provide the full type declaration with all types down the rabbit hole. Till you somewhere introduce a pointer to opaque type indirection. And then there macros ... Modules attempt to do that better, by providing just the interface in a file. But hey, C++ standard doesn't "know" about those, so module interface files aren't a portable thing ... | ||