Cytuj:
Jest Pan w wielkim błędzie (bez obrazy).
Nie obrażam się i pewnie masz rację - ja jestem tylko człowiekiem i też się mylę.
robert95 napisał(a):
Rozumiem co to znaczy podział na pliki: w jednym, nagłówkowym, umieszczamy wszystkie definicje itp. aby potem móc tylko napisać w pliku głównym #include "nazwa.h" i cieszyć się np. o wiele bardziej przystępnymi nazwami, przede wszystkim krótszymi, które są umieszczone w tej naszej "bibliotece"
I mam nadzieję, że też się nie obrazisz jeśli jednak powiem, że jeszcze może nie do końca to rozumiesz ale już staram się pomóc i doprecyzować - pytać zawsze warto - po to jest to forum.
na czerwono zaznaczyłem jeden z poważniejszych błędów jaki popełniasz w rozważaniach (być może to tylko literówka i miałeś na myśli deklaracje) no ale skoro napisałeś definicje - to muszę się do tego odnieść bo przez pół książki staram się wyjaśniać i zwracać uwagę, że NIEZROZUMIENIE różnic w tej kwestii czyli czym różni się definicja o deklaracji jest powodem ogromnej ilości dalszych błędów w rozumieniu. A więc w tym miejscu powinno być że w pliku nagłówkowym umieszczamy DEKLARACJE .... a wyjątkiem są (definicje preprocesora) ale to coś innego niż definicje w języku C. Reasumując pliki nagłówkowe owszem są także po to aby umieszczać w nich definicje preprocesora #define itp ... ale to mały pikuś jeśli chodzi o istotę zalet podziału na pliki
Bodajże najważniejszą rzeczą jest to że dzięki nie można pięknie dzielić projekt na logicznie połączone fragmenty/ klocki.
Oczywiście później dołączamy w plikach źródłowych *.c tylko pliki *.h w których mamy co ? (zapomnij na razie o definicjach preprocesora ok)
w których mamy DEKLARACJE funkcji naszej tzw biblioteki - zgadza się ?
i teraz pomyśl jak ja piszę bibliotekę to te funkcje które chcę eksportować do innych plików pewne funkcje - tak aby użytkownik się nimi posługiwał to DEKLARACJE tych funkcji przenoszę do pliku nagłówkowego. Dzięki temu funkcje te dostępne są dla użytkownika - bazując na tym przykładzie LCD masz dostępne takie np funkcje jak:
lcd_str()
lcd_int()
i wiele innych zgadza się ? i zauważ że na końcu pliku nagłówkowego są ich DEKLARACJE bo DEFINICJE są w pliku *.c
ale .... ale czy widzisz w pliku *.h DEKLARACJĘ tej funkcji o którą pytasz w pierwszym wątku ? No przyznasz chyba że nie ...
co to oznacza ? oznacza to kilka rzeczy
po pierwsze nie uważałem tego za stosowne aby dawać użytkownikowi tej biblioteki dostępu do tej funkcji - i chyba widzisz że pomimo dołączenia pliku *.h nie uda ci się z niej skorzystać w pliku main.c zgadza się ????
dokonałem tego właśnie m.in w ten sposób że nie dałem DEKLARACJI w pliku nagłówkowym, ale gdybym nie opatrzył jej jeszcze dodatkowo słówkiem static to gdybyś spróbował sam ją dodać do *.h i jej użyć w swoim main.c - to udałoby ci się to
gdy zaś opatrzyłem ją specyfikatorem static to powiedziałem kompilatorowi
EEE panie kompilator, wara ze swoimi łapskami .... i pod żadnym pozorem nie udostępniaj tej funkcji jeśli user chciałby z niej skorzystać ... i tym razem gdybyś chciał z niej skorzystać to kompilator już nie da ci warninga a ERROR'a i QUNIEC
ale jest jeszcze jedna ważna zaleta specyfikatora static dla funkcji. Jeśli go użyłem i kompilator wie, że taka funkcja nie będzie do użtku publicznego to może ją optymalizować w trakcie kompilacji o wiele lepiej na tle że po prostu kod funkcji oddzielnej zniknie a jej rozkazy zostaną wmiksowane w każde miejsce gdzie została użyta - tak jak funkcja inline - albo jeszcze inne sztuczki zrobi i w efekcie twoim oczom ukaże się po kompilacji że zużyłeś MNIEJ pamięci FLASH niż gdyby była bez static
może teraz lepiej ?