Kanał - ATNEL tech-forum
Wszystkie działy
Najnowsze wątki



Teraz jest 26 mar 2026, o 12:04


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 1 ] 
Autor Wiadomość
PostNapisane: 16 lut 2017, o 06:09 
Offline
Moderator
Avatar użytkownika

Dołączył(a): 03 paź 2011
Posty: 27450
Lokalizacja: Szczecin
Pomógł: 1045

Funkcje zagnieżdżone nie są dopuszczalne w czystym C, ale za to są dopuszczalne przez niektóre kompilatory albo rozszerzenia kompilatorów, np w AVR GCC są możliwe w C ale już w C++ nie zadziałają.

Wobec powyższego moim zdaniem korzystanie z funkcji zagnieżdżonych w przypadku gdy przyjdzie nam kiedyś przeportować kod na inny kompilator może być zgubne.

Oczywiście ktoś może powiedzieć, że nie interesuje go przeportowywanie na inny kompilator a tym bardziej, że praktycznie teraz dla każdej platformy sprzętowej jest dostępny GCC z takim rozszerzeniem umożliwiającym korzystanie z funkcji zagnieżdżonych.

Zaletą funkcji zagnieżdżonych może być fakt, że mogą one korzystać ze zmiennych lokalnych! funkcji w której ciele żyje funkcja zagnieżdżona. Przy czym może to być zaletą ale też wadą i prowadzić do ciężkich błędów, które później często trudno znaleźć. Przykład

Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


ta pętla for może się nigdy nie zakończyć jeśli z PINC będzie odczytywana wciąż np wartość = 3 i będzie psuć działanie pętli. A jeszcze gorzej może być gdy zmienna i w zagnieżdżonej funkcji zostanie również użyta do pętli for() ;) wtedy będzie "wieczna extaza"

Chociaż z drugiej strony może to być i czasem zaletą.

Oczywistą zaletą funkcji zagnieżdżonych jest też fakt, że np nie trzeba przekazywać przez stos (za pomocą argumentów) zmiennych lokalnych funkcji nadrzędnej w której one żyją - a więc czasem może być to pożyteczne dla jakiejś tam własnej optymalizacji.

Kolejną zaletą może być fakt, że funkcje zagnieżdżone z natury nie będą mogły być NIGDY funkcjami globalnymi jeśli na tym nam zależy.

Funkcje zagnieżdżone są używane w wielu innych językach programowania jak Cobol, Pascal, Fortran, Ada, Python

więc nie ma jakiegoś wielkiego problemu z ich używaniem w AVR GCC jeśli jesteśmy pewni, że nie będziemy tego przenosić do C++ albo na inne kompilatory nie posiadające takiej opcji.

Wady ... hmm jako funkcje niezgodne ze standardem C mogą powodować, dla większości, że program będzie mniej czytelny a tym bardziej, że niewiele osób korzysta z funkcji zagnieżdżonych. Tak jak pisałem wyżej trzeba bardzo uważać na wykorzystywanie zmiennych lokalnych funkcji rodzica ;) przykład z pętlą wyżej jest banalny ale można sobie wyobrazić na tym przykładzie w jakie czasem pułapki można popaść.

STOSOWAĆ czy NIE STOSOWAĆ ? - oto jest pytanie

moim zdaniem, z funkcjami zagnieżdżonymi jest jak z każdym narzędziem, tak jak i ze wskaźnikami w C, które mogą być i są mega przydatne ale nieumiejętne posługiwanie się nimi może przyprawić o ból brzucha niejeden program ;) ... Tak samo funkcje zagnieżdżone. I tak samo zwykły młotek - można sobie palce nieźle poobijać jak się nie wbijało dużo gwoździ ;)

Dlatego ja np początkującym w programowaniu w C dla procków nie wspominam o funkcjach zagnieżdżonych albo odradzam ich używanie - za to gdy już ktoś zaczyna czuć się dobrze "w te klocki" i w końcu sam dojdzie do tego, że np w GCC są dostępne funkcje zagnieżdżone i dostrzega ich zalety - no to jak wtedy odradzać ? ;)


Autor postu otrzymał pochwałę

_________________
zapraszam na blog: http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj Kurs EAGLE ] [ mój kanał YT TV www.youtube.com/mirekk36 ]



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
Wyświetl posty nie starsze niż:  Sortuj wg  
Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 1 ] 

Strefa czasowa: UTC + 1


Kto przegląda forum

Użytkownicy przeglądający ten dział: Google [Bot] i 2 gości


Nie możesz rozpoczynać nowych wątków
Nie możesz odpowiadać w wątkach
Nie możesz edytować swoich postów
Nie możesz usuwać swoich postów
Nie możesz dodawać załączników

Szukaj:
Skocz do:  
cron
Sitemap
Technologię dostarcza phpBB® Forum Software © phpBB Group phpBB3.PL
phpBB SEO