While variables and other bits that occupy memory might be visible in the header, they are essentailly only forward declarations.
It is external when you compile program.c using unit.h. But when you compile unit.c with unit.h, afaik since ISO C (not K&R) these declarations are checked, which is more forward style.
The point is that however you want to view it (which depends on context), the header versions don't allocate memory ;-)