Possiamo avere una funzione annidata in C? Qual è l'uso delle funzioni annidate? Se esistono in C, la loro implementazione differisce da compilatore a compilatore?
Possiamo avere una funzione annidata in C? Qual è l'uso delle funzioni annidate? Se esistono in C, la loro implementazione differisce da compilatore a compilatore?
Risposte:
Non è possibile definire una funzione all'interno di un'altra funzione nello standard C.
Puoi dichiarare una funzione all'interno di una funzione, ma non è una funzione annidata.
gcc ha un'estensione del linguaggio che consente funzioni annidate . Non sono standard e come tali dipendono interamente dal compilatore.
No, non esistono in C.
Sono usati in linguaggi come Pascal per (almeno) due motivi:
Funzioni nidificate non sono una parte di ANSI C , tuttavia, fanno parte di Gnu C .
No, non puoi avere una funzione annidata in C
. Il più vicino che puoi arrivare è dichiarare una funzione all'interno della definizione di un'altra funzione. La definizione di quella funzione, però, deve apparire al di fuori di qualsiasi altro corpo di funzione.
Per esempio
void f(void)
{
// Declare a function called g
void g(void);
// Call g
g();
}
// Definition of g
void g(void)
{
}
g
è visibile più avanti nel file, quella dichiarazione è nell'ambito del resto dell'unità di traduzione. Inoltre puoi chiamare funzioni in C senza una dichiarazione visibile nell'ambito anche se non è consigliabile.
Lo dico perché molte persone che codificano in C ora usano compilatori C ++ (come Visual C ++ e Keil uVision) per farlo, quindi potresti essere in grado di usarlo ...
Sebbene non sia ancora consentito in C, se stai utilizzando 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 alcuni linguaggi 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 siano viste dall'esterno.
In C , questo può essere fatto inserendo tali funzioni in un file sorgente separato. Definisci la funzione principale come globale e tutte le altre funzioni e variabili come statiche . Ora solo la funzione principale è visibile all'esterno di questo modulo.
outer
-> nested
-> outer
-> nested
, allora ci sarebbero due frame diversi che tengono int declared_in_outer
, quindi non puoi semplicemente metterlo declared_in_outer
come globale statico.
Per rispondere alla tua seconda domanda, esistono linguaggi che consentono la definizione di funzioni annidate (un elenco può essere trovato qui: annidato-funzioni-lingua-elenco-wikipedia ).
In JavaScript, che è uno dei più famosi di quei linguaggi, una delle funzioni annidate (che sono chiamate chiusure) sono:
per dirne alcuni...
Oppure puoi essere intelligente e utilizzare il preprocessore a tuo vantaggio ( source.c
):
#ifndef FIRSTPASS
#include <stdio.h>
//here comes your "nested" definitions
#define FIRSTPASS
#include "source.c"
#undef FIRSTPASS
main(){
#else
int global = 2;
int func() {printf("%d\n", global);}
#endif
#ifndef FIRSTPASS
func();}
#endif
non è questa una funzione annidata in C? (la funzione displayAccounts ())
So che avrei potuto definire la funzione in modo diverso e passare variabili e cosa no, ma comunque funziona bene poiché avevo bisogno di stampare gli account più volte.
(beccuccio tratto da un compito 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;
}