stanleysts napisał: Jeśli np. z niektórych zmiennych korzystasz tylko w module usart a nie w main to możesz je zrobić jako global static (chyba te zmienne const się do tego nadają) i wtedy nie trzeba ich też extern robić bo main z nich nie korzysta
const musi być znany podczas kompilacji a nie jest. Przerzuć te zmienne do pliku cpp i będzie ok.
Ja może wyjaśnię w czym problem. Masz sobie plik hpp, w którym deklarujesz zmienne (nigdy nie wolno tego robić):
Zaloguj się, aby zobaczyć kod
Masz też dwa pliki cpp, w których includujesz sobie ten plik hpp:
Zaloguj się, aby zobaczyć kod
Zaloguj się, aby zobaczyć kod
Co widzi kompilator (a w zasadzie linker)?
Kompilator w uproszczeniu widzi coś takiego:
Zaloguj się, aby zobaczyć kod
Jak w jednym pliku zadeklarujesz takie same zmienne, to otrzymasz taki sam błąd jak Ci wyskakuje. Może nie jest to jasne i oczywiste, ale zmienne zadeklarowane jako globalne, są dostępne nie tylko w obrębie całego pliku, ale całego programu. O fakcie, że zmienne zostały zadeklarowane gdzieś indziej informuje się linker poprzez dodanie słowa kluczowego extern (nie alokuje to pamięci dla zmiennych, jest to jedynie info dla linkera, że zmienna jest w innym pliku). Deklarując zmienną w w pliku nagłówkowym, deklarujesz ją w każdym pliku, w którym ten nagłówek includujesz. Stąd te błędy.