BarGai napisał(a):
Teraz usuwam z niej słówko static. Tak jak napisałem w pierwszym poście, nie potrafię zauważyć różnicy
Chyba wiem o co Koledze chodzi.
Brak różnic pewnie wynika z opcji kompilacji, niestety nie jestem na tyle biegły, żeby wskazać o które opcje chodzi.
Natomiast pewne jest, że jeśli zdefiniujesz jakąś funkcję z opcją static i nie wykorzystasz jej, to dostaniesz ostrzeżenie od kompilatora:
"warning: 'temp_func' defined but not used [-Wunused-function]".
Gdzie istotna jest tutaj opcja kompilatora "-Wunused-function", która dba o optymalizację miejsca na kod programu.
To wydaje się oczywiste, że kompilator dba o to by nie "zaśmiecać" pamięci programu funkcjami niepotrzebnymi, w ten sposób zaoszczędzimy miejsce w pamięci flash.
Jeśli usuniesz "static" to powyższego ostrzeżenia nie dostaniesz i niepotrzebną funkcję umieścisz w pamięci programu.
Ten rodzaj optymalizacji jest wg mnie bardzo pożądany.
A teraz najciekawsze. Początkującym najczęściej się wydaje, że jeśli zrobią definicję funkcji np w pliku
plik_temp.c to deklaracja funkcji musi być koniecznie w pliku
plik_temp.h.
Nic bardziej mylnego, deklarację można zrobić równie dobrze w pliku main.c, czy jeszcze zupełnie innym, nagłówkowym czy też źródłowym.
Oczywiście miejsce deklaracji musi mieć uzasadnienie. Jeśli pojawi się w main.c to jedynym modułem, gdzie można użyć funkcji będzie main.o
Jeśli deklarację wrzucimy do jakiegoś innego pliku nagłówkowego .h to funkcji będzie można użyć wszędzie tam gdzie zostanie zainkludowana te plik nagłówkowy.
Tu pewnie się mylę, ale wg mnie deklaracja funkcji jest głównie potrzebna linkerowi i mówi, że "gdzieś" w modułach znajduje się funkcja o tej konkretnej nazwie.
Przedrostek static pozwala na tworzenie wielu funkcji o tych samych nazwach w wielu modułach. Wynika to wg mnie z bardzo dużej elastyczności języka C, ale czasami może wprowadzać w konsternację programistę, więc chyba raczej nie powinno się z tego korzystać.
Jeśli pojawi się gdzieś deklaracja funkcji o tej samej nazwie, to ona nie będzie "wskazywać" na żadną funkcję w pamięci programu, bo wszystkie będą static, ale wystarczy, że tylko z jednej z nich usuniemy static to właśnie ta będzie mogła być widziana przez inne moduły.
Jeśli tylko w modułach pojawią się co najmniej dwie te same nazwy funkcji, bez static to zaraz otrzymamy błąd:
"multiple definition of " i to wykryje
linker.
A jeszcze jedna ciekawa cecha przychodzi mi do głowy.
Jeśli w dowolnym module zdefiniujesz funkcję to wcale jej deklaracji nie musisz umieszczać w pliku nagłówkowym.
Wystarczy, że w dowolnym pliku źródłowym, przed wywołaniem tej funkcji, umieścisz jej deklarację.
Tych deklaracji możesz robić wiele, praktycznie w każdym pliku źródłowym, tam gdzie interesuje cię wywołanie tej funkcji.
Takie działanie jest oczywiste, w końcu "include" kopiuje całe pliki nagłówkowe i umieszcza je tam gdzie następuje wywołanie tej dyrektywy.
Po prostu deklaracja to tak jakby "wskaźnik", że ciało funkcji jest "gdzieś" dostępne, a poprawnym wskazaniem zajmuje się właśnie linker.