`#include "foo.c"` would repeat the implementation in multiple object files which is both wasteful and, if not using static, create conflicting symbols.
You missed the "with extra steps".
#define XXX_IMPL
#include "xxx.h"
And
#include "xxx.c"
Are exactly the same trash.
No they are not, the former allows you to include the header file in multiple .c files, the latter does not.