Forcing me to define `XXX_IMPL` in a single compilation unit is not a header-only library.

It will simply force me to make a `.c` file for every `.h` and define it there.

Why not simply distribute the .c/.h like imgui does, or lua, or many many others? I'm already copy/pasting your .h files, I would not mind copy/pasting .c files and adding them to my build system, since that's what I'm gonna do anyway to make sure i do not define `XXX_IMPL` multiple times.

Header-only libraries truly only work in C++ when it's all templates anyway.

> It will simply force me to make a `.c` file for every `.h` and define it there.

You can do that of course but you'd be missing the point of how it is meant to be used. Your project already has at least a single .c file anyway, so why make a separate .c file just so you can put `XXX_IMPL` in there instead of putting it in the .c file that is going to be using the library itself?

Because:

  - I like my object files (.o) to only contain what they are supposed to contain and nothing else
  - I don't want to have to keep track of where did I put the `XXX_IMPL`
No I'm not missing the point of how it is meant to be used, I'm criticizing that use case as a very poor one, I'd even say it's an anti-pattern IMHO.

Right, but those would be your choices, it wouldn't be the library itself forcing you to do that, it would be your personal preferences. That isn't a fault of the library.

By not making a choice, the library is actually making the worst possible decision.

It is bloating my ABI if I'm not careful, and it makes distributing more cumbersome when it could/should be straightforward.

That's just not how you are supposed to distribute a C library, this is a poor design that clearly states "I don't know or don't care how to package my code".

There really is no "correct way" to distribute C libraries and at this point it seems you're nitpicking just to nitpick. Imgui uses the same method, no one ever complained. If you do require obj files to not be "bloated" (why?) you can always do it the C way of having separate C/H files.

imgui distribute .c/.h files, not .h files with .c embedded in them.

What I'm criticizing is the extra step of me having to write the .c files anyway to avoid bloating the obj files, which should have been done by the library in the first place.

As others have pointed out, you don't need to write extra .c files, and you won't bloat the obj files. This paradigm is fairly common, see, e.g.:

https://github.com/lieff/minimp3

https://github.com/Immediate-Mode-UI/Nuklear

https://github.com/mattiasgustavsson/libs/blob/main/docs/htt...