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
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ć ?
