2010-04-09 9 views
62

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

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

+1

sembra essere un duplicato di: http://stackoverflow.com/questions/1348095/why-are-nested-functions-not-supported-by- the-c-standard – zoli2k

+1

anche http://stackoverflow.com/questions/666586/are-nested-functions-part-of-c-standard e http://stackoverflow.com/questions/2256647/is-it-possible -in-c-o-c-to-create-a-function-inside-another e http://stackoverflow.com/questions/957592/functions-inside-functions-in-c e altri tratti da http: // stackoverflow.com/search?q=nested+functions+[c] – dmckee

+0

Usa Python, è più facile. –

risposta

76

Non è possibile definire una funzione all'interno di un'altra funzione in serie C.

È possibile dichiarare una funzione all'interno di una funzione, ma non è una funzione annidata.

gcc ha a language extension that allows nested functions. Sono non standard e, come tali, dipendono interamente dal compilatore.

26

No, non esistono in C.

Essi sono utilizzati in linguaggi come Pascal per (almeno) due motivi:

  1. Essi permettono la decomposizione funzionale senza namespace inquinante. È possibile 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.
13

No, non è possibile avere una funzione nidificata in C. Il più vicino possibile è 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.

E.g.

void f(void) 
{ 
    // Declare a function called g 
    void g(void); 

    // Call g 
    g(); 
} 

// Definition of g 
void g(void) 
{ 
} 
+3

Se la funzione g è dichiarata in questo modo, allora quale sarà il suo scopo? –

+4

La dichiarazione ha lo scope come qualsiasi altra dichiarazione, quindi in questo caso fino alla fine della funzione. Ovviamente una volta che la definizione di 'g' è visibile più avanti nel file, quella dichiarazione è nel campo di applicazione per il resto dell'unità di traduzione. Inoltre, _can_ chiama le funzioni in C senza una dichiarazione visibile in ambito anche se non è consigliabile. –

12

funzioni nidificate non sono una parte di ANSI C, tuttavia, they are part ofGnu C.

+0

Qual è il significato se fanno parte di Gnu C –

+0

@Sachin Aiuta a capire perché il codice C con funzioni annidate può essere compilato con gcc. L'informazione ha valore educativo. Inoltre, la domanda non viene specificata se è limitata solo a C89, C99 o GNU C – zoli2k

+3

Altri linguaggi supportati da GCC li hanno (ADA e Pascal che conosco), quindi è probabile che sia stato facile aggiungere all'implementazione C o che è stato aggiunto a C per prepararsi a supportare le lingue che li richiedono. – nategoose

2

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 statico. Ora solo la funzione principale è visibile all'esterno di questo modulo.

+0

Se è presente la ricorsione 'outer'->' nested'-> 'outer'->' nested', allora ci sarebbero due diversi fotogrammi che contengono 'int dichiarato_in_outer', quindi non puoi semplicemente mettere' declarata_in_outer' come statica globale. –

3

Dico questo 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 fare uso di questo ...

Sebbene non sia ancora consentito in C, se si sta utilizzando C++, è possibile ottenere lo stesso effetto con le funzioni lambda introdotte in C++ 11:

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

    g(); 
} 
+2

La domanda riguardava specificamente C, non C++ – Virgile

+2

@Virgile - E la domanda specificava anche "Le funzioni nidificate sono consentite in qualsiasi altra lingua?". La risposta di Jon mi ha aiutato. – user1863152

-1

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

So che avrei potuto definire la funzione in modo diverso e passare le variabili e cosa no, ma comunque funziona bene come avevo bisogno di stampare gli account più volte.

(snipet preso 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; 
} 
+3

Non è standard legale C. Se funziona con il compilatore, è perché il compilatore ha fornito un'estensione al linguaggio C standard; in un certo senso il tuo compilatore sta compilando un linguaggio diverso, che è, in senso stretto, non C. –

+0

grazie per il tuo contributo.Da allora ho imparato il modo corretto di dichiarare, definire e utilizzare le funzioni. questo è un po 'imbarazzante per guardare indietro>. < – midnightCoder

1

Per rispondere alla tua seconda domanda, ci sono linguaggi che permettono di definire funzioni annidate (un elenco può essere trovato qui: nested-functions-language-list-wikipedia).

In JavaScript, che è uno dei più famosi di queste lingue, alcuni usi di funzioni nidificate (che sono chiamati chiusure) sono:

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

per citarne alcuni ...