Nie wiem czy to ważne, ale w zasadzie plik nagłówkowy *.h (z ang. header) może mieć dowolne rozszerzenie (nie tylko h). Poza tym Kolega Mokrowski dokładnie opisał całą najważniejszą esensję, czyli że przy już na etapie projektowania (ale jeszcze nie programowania) bierze się pod uwagę podział logiczny i funkcjonalny całego projektu. Logiczny mam na myśli to na ile plików (modułów) będzie to podzielone, funkcjonalny czyli jakie funkcje będą posiadały kolejne moduły.
Kiedyś Pan prof. Jerzy Grębosz opisywał w "Symfonii C++" taki ciekawy problem (podaję go tutaj jako typowy problem logiczny):
Mamy 3 zegary sterujące czujnikami temperatury i chodzi o to, żeby W TYM SAMYM czasie co do milisekundy były odpalone. Jak dobrze zsynchronizować te 3 zegary? -Wprowadza się 4-ty zegar typu master, który posiada JEDEN i ten sam czas i w oparciu o to synchronizowana jest reszta zegarów. Nie wiem, może to co piszę to tutaj może się wydać, że to bzdury, ale PORÓWNANIE problemu wysterowania zegarów i kontroli nad projektem jest takie, że funkcja main.c to taki jakby zegar master, a cała reszta plików (modułów = *.h + *.c) to mogą być albo slave'y, albo kolejne mastery (jednak jako mastery podrzędne w stosunku do głównego mastera main.c).
Strzałka na rysunku wskazuje agregację. Grot strzałki wskazuje na plik(i) które są nadrzędne w stosunku do drugiego końca strzałki. Pliki nadrzędne zawierają w sobie dyrektywy include ładujące potrzebne im moduły (funkcje i zmienne). Na żółto zaznaczona funkcja (moduł) nadrzędna - główny kontroler, czyli tzw. master (w ujęciu master/slave). Na zielono zaznaczone są moduły (funkcje) nadrzędne w stosunku do modułów białych (czujników), ale podrzędne w stosunku do głównego kontrolera (głównego mastera).
Teraz co do samego języka c stosuje się jeszcze dyrektywy preprocesora (np. ifndef, define etc.), bo dalej gdyby miały wchodzić pojęcia typu klasy, funkcje i zmienne wbudowane, to wtedy wkraczamy w język C++. Tam to już inaczej niektóre sprawy się rozwiązuje (enkapsulacja, dziedziczenie, klasy abstrakcyjnie, etc., typy private, protected, public). Moje osobiste zdanie jest takie, że do celów zbudowania np. sterownika inteligentnego domu sam język avr c spokojnie wystarczy. Należy uważać na dostęp do zmiennych i załączenie odpowiednich nagłówków.
Na koniec przepraszam, że używam niezbyt specjalistycznego języka, ale.. cóż.. uważam, że czasem trzeba napisać coś prościej - nawet jeśli jako tłumaczący (czyli ja) mam wyjść na głupka, bo chcąc dobrze mimo wszystko pomyli jakieś pojęcia. Takie ryzyko.
A na egzaminie nie jestem, tylko na przyjaznym forum, gdzie czy pochwały, czy wytknięcie błędów jest mile widziane.
Pozdrawiam! Jarek
P.S. Kolego Moderatorze Jaglarz, chyba nie użyłem odpowiedniej składni do kodu na moim rysunku... Upss..