Myślę, że tu bardziej chodzi o sytuację, kiedy plik nagłówkowy
lcd.h (odnosząc się do przykładowych zrzutów ekranu z postu kolegi Mirka) dołączamy do innego pliku np.
menu.c, w którym
nie jest dołączany (bezpośrednio lub pośrednio np. poprzez
avr/io.h) plik nagłówkowy
stdint.h (bo to w nim jest definicja typu
uint8_t używanego przez parametr funkcji). W takiej sytuacji, niezależnie od kolejności "inkludowania" nagłówków w pliku
lcd.c problem wyniknie podczas kompilacji pliku
menu.c. Gdyby w pliku
main.c nie było dyrektywy preprocesora
#include <avr/io.h>, problem też by wystąpił, ponieważ w deklaracji funkcji
write_half() występuje parametr typu
uint8_t. Myślę, że o taką sytuację chodziło autorowi tego wątku.
dayer41 napisał(a):
Dlaczego w pliku .h wyrzuca mi error : unknown type name uint8_t, skoro w pliku hd44780.c załączyłem plik io.h PRZED plikiem nagłówkowym hd44780.h?
Oczywiscie załączenie w pliku .h biblioteki stdlib.h rozwiązuje problem, ale nie rozumiem czemu w jednym projekcie nie muszę tego robić, a w innym muszę.
Pliki nagłówkowe nie są analizowane podczas kompilacji oddzielnie, tylko w połączeniu z plikiem
*.c, do którego zostały dołączone, oraz w połączeniu z innymi plikami nagłówkowymi dołączonymi do tego pliku
*.c. Każdy taki zestaw - plik
*.c z dołączonymi do niego plikami nagłówkowymi - to tzw. jednostka translacji.
Z kolei każda taka jednostka translacji jest oddzielnym tworem. Jeśli jedna jednostka translacji ma dołączony plik nagłówkowy definiujący typ
uint8_t, to inna jednostka translacji nic o tym nie wie, więc - jeśli ten typ jest użyty np. do zadeklarowania parametru funkcji - musi też mieć dołączony odpowiedni plik nagłówkowy.
To wymusza konieczność zachowania pewnych zależności pomiędzy plikami nagłówkowymi oraz zależności w odpowiedniej kolejności ich dołączania.
W opisanej przez Ciebie sytuacji, jeżeli do pliku
hd44780.c dołączyłeś plik nagłówkowy
<avr/io.h> przed plikiem nagłówkowym
hd44780.h, to będzie OK. Jeśli teraz dołączasz plik nagłówkowy
hd44780.h do innego pliku źródłowego
*.c, to jest to osobna jednostka translacji, która zna typ
uint8_t, lub go nie zna (czytaj: ma dołączony pośrednio lub bezpośrednio plik nagłówkowy
stdint.h, lub nie ma). Jeśli więc w tym pliku
*.c nie masz jeszcze dołączonego odpowiedniego pliku nagłówkowego
stdint.h i typ
uint8_t w tej jednostce translacji nie jest znany, to dołączenie pliku nagłówkowego
hd44780.h wymusi dołączenie pliku nagłówkowego
stdint.h (bezpośrednio lub poprzez dołączenie np.
<avr/io.h>).
W takiej sytuacji należy umieścić w pliku nagłówkowym
hd44780.h komentarzu w stylu:
"przed dołączeniem tego pliku nagłówkowego dyrektywą #include do pliku *.c należy dodać także plik nagłówkowy stdint.h".
Można też na początku pliku
hd44780.h dodać po prostu linijkę:
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
i też będzie OK. Jeśli dołączysz ten plik do pliku
*.c, w którym
stdint.h jest już dołączone, to nic się nie stanie, ponieważ pliki nagłówkowe mają (a przynajmniej powinny mieć) zabezpieczenie przed wielokrotnym inkludowaniem. Jeśli w tym pliku
*.c nie będzie dołączonego
stdint.h, to zostanie dołączony poprzez plik
hd44780.h