Mňo, moc nevím, proč cpeš proměnné sémanticky patřící k jednotlivým TU do struktur (neuvažuješ-li více instancí), ale budiž. Já to většinou řeším tak, že v headeru deklaruju jenom funkce (a případně datové typy) které tvoří veřejné API příslušného modulu a všechno ostatní mám staticky v implementačním souboru.
Taky jsi patrně nepochopil, k čemu je paměťová třída extern. Ta označuje externí linkování - ve zkratce říká překladači, že instance proměnné není v dané TU, ale v nějaké jiné, která se přilinkuje k programu později. Ty ale nikde file1 nemáš deklarovanou s interním linkováním - tzn. linker ti při pokusu o sestavení executable chcípne.
A propos, proč bys nemohl použít C++? Když nepoužiješ virtuální metody, nemají třídy oproti céčkovým POD + funkcím žádný overhead.