Funzione annidata in C

Possiamo avere una funzione annidata in C? A che cosa servono le funzioni annidate? Se esistono in C la loro implementazione differisce da compilatore a compilatore?

Le funzioni nidificate sono consentite in qualsiasi altra lingua? Se sì, allora qual è il loro significato?

Non è ansible definire una funzione all’interno di un’altra funzione in standard C.

È ansible dichiarare una funzione all’interno di una funzione, ma non è una funzione annidata.

gcc ha un’estensione di linguaggio che consente funzioni nidificate . Sono non standard e, come tali, dipendono interamente dal compilatore.

No, non esistono in C.

Sono usati in lingue come Pascal per (almeno) due ragioni:

  1. Permettono la decomposizione funzionale senza spazi dei nomi inquinanti. È ansible definire una singola funzione visibile pubblicamente che implementa alcune logiche complesse basandosi su una o più funzioni annidate per suddividere il problema in parti logiche più piccole.
  2. Semplificano il passaggio dei parametri in alcuni casi. Una funzione nidificata ha accesso a tutti i parametri e alcune o tutte le variabili nell’ambito della funzione esterna, quindi la funzione esterna non deve passare esplicitamente una pila di stato locale nella funzione nidificata.

No, non puoi avere una funzione annidata in C Il più vicino ansible è dichiarare una funzione all’interno della definizione di un’altra funzione. La definizione di tale funzione deve apparire al di fuori di qualsiasi altro corpo di funzione, comunque.

Per esempio

 void f(void) { // Declare a function called g void g(void); // Call g g(); } // Definition of g void g(void) { } 

Le funzioni annidate non fanno parte di ANSI C , tuttavia fanno parte di Gnu C.

Dico questo perché molte persone che codificano in C ora usano i compilatori C ++ (come Visual C ++ e Keil uVision) per farlo, quindi potresti essere in grado di fare uso di questo …

Sebbene non sia ancora consentito in C, se stai usando C ++, puoi ottenere lo stesso effetto con le funzioni lambda introdotte in C ++ 11:

 void f() { auto g = [] () { /* Some functionality */ } g(); } 

Come altri hanno risposto, lo standard C non supporta le funzioni annidate.

Le funzioni annidate vengono utilizzate in alcune lingue per racchiudere più funzioni e variabili in un contenitore (la funzione esterna) in modo che le singole funzioni (esclusa la funzione esterna) e le variabili non vengano visualizzate dall’esterno.

In C , questo può essere fatto inserendo tali funzioni in un file sorgente separato. Definire la funzione principale come globale e tutte le altre funzioni e variabili come statiche . Ora solo la funzione principale è visibile al di fuori di questo modulo.

Per rispondere alla tua seconda domanda, ci sono linguaggi che consentono di definire funzioni annidate (una lista può essere trovata qui: nested-functions-language-list-wikipedia ).

In JavaScript, che è uno dei più famosi di quei linguaggi, alcuni usi di funzioni annidate (che sono chiamate chiusure) sono:

  • Per creare metodi di class in costruttori di oggetti.
  • Per raggiungere la funzionalità dei membri della class privata insieme a setter e getter.
  • Non inquinare lo spazio dei nomi globale (ovviamente per ogni lingua, ovviamente).

per dirne alcuni…

questa non è una funzione annidata in C? (la funzione displayAccounts ())

So che avrei potuto definire la funzione in modo diverso e passare le variabili e ciò che non è, ma comunque funziona bene come ho bisogno di stampare gli account più volte.

(cecchino tratto da un incarico scolastico) …

 //function 'main' that executes the program. int main(void) { int customerArray[3][3] = {{1, 1000, 600}, {2, 5000, 2500}, {3, 10000, 2000}}; //multidimensional customer data array. int x, y; //counters for the multidimensional customer array. char inquiry; //variable used to store input from user ('y' or 'n' response on whether or not a recession is present). //function 'displayAccounts' displays the current status of accounts when called. void displayAccounts(void) { puts("\t\tBank Of Despair\n\nCustomer List:\n--------------"); puts("Account # Credit Limit\t Balance\n--------- ------------\t -------"); for(x = 0; x <= 2; x++) { for(y = 0; y <= 2; y++) printf("%9d\t", customerArray[x][y]); puts("\n"); } } displayAccounts(); //prints accounts to console. printf("Is there currently a recession (y or n)? "); //... return 0; }