2010-04-09 13 views
62

Können wir eine verschachtelte Funktion in C haben? Was nützen geschachtelte Funktionen? Wenn sie in C existieren, unterscheidet sich ihre Implementierung von Compiler zu Compiler?Verschachtelte Funktion in C

Sind verschachtelte Funktionen in einer anderen Sprache erlaubt? Wenn ja, was ist ihre Bedeutung? Kein

+1

scheint ein Duplikat zu sein: http://stackoverflow.com/questions/1348095/why-are-nested-functions-not-supported-by- the-c-standard – zoli2k

+1

auch http://stackoverflow.com/questions/666586/are-nested-functions-part-of-c-standard und http://stackoverflow.com/questions/2256647/is-it-possible -in-c-or-c-zu-erstellen-eine-Funktion-innerhalb-andere und http://stackoverflow.com/questions/957592/functions-inside-functions-in-c und andere von http: // stackoverflow.com/search?q=nested+functions+[c] – dmckee

+0

Verwenden Sie Python, es ist einfacher. –

Antwort

76

Sie können keine Funktion innerhalb einer anderen Funktion in Standard C

definieren Sie eine Funktion innerhalb einer Funktion erklären kann, aber es ist nicht eine verschachtelte Funktion.

gcc hat a language extension that allows nested functions. Sie sind nicht standardisiert und als solche vollständig Compiler-abhängig.

26

, sie existieren nicht in C.

Sie werden in Sprachen wie Pascal für (mindestens) zwei Gründe:

  1. Sie ermöglichen funktionelle Zersetzung ohne Namensraum verschmutzen. Sie können eine einzelne öffentlich sichtbare Funktion definieren, die eine komplexe Logik implementiert, indem Sie eine oder mehrere verschachtelte Funktionen verwenden, um das Problem in kleinere logische Teile aufzuteilen.
  2. Sie vereinfachen die Parameterübergabe in einigen Fällen. Eine geschachtelte Funktion hat Zugriff auf alle Parameter und einige oder alle Variablen im Bereich der äußeren Funktion, so dass die äußere Funktion nicht explizit einen Stapel des lokalen Zustands in die verschachtelte Funktion übergeben muss.
13

Nein, Sie können keine verschachtelte Funktion in C haben. Der nächste, den Sie kommen können, ist eine Funktion innerhalb der Definition einer anderen Funktion zu deklarieren. Die Definition dieser Funktion muss jedoch außerhalb eines anderen Funktionskörpers erscheinen.

z.

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

    // Call g 
    g(); 
} 

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

Wenn die Funktion g auf diese Weise deklariert wird, was wird dann ihr Umfang sein? –

+4

Die Deklaration ist wie jede andere Deklaration, also in diesem Fall bis zum Ende der Funktion. Sobald die Definition von "g" später in der Datei sichtbar ist, ist diese Deklaration natürlich für den Rest der Übersetzungseinheit gültig. Zusätzlich können Sie Funktionen in C ohne sichtbare Deklaration aufrufen, auch wenn dies nicht ratsam ist. –

12

verschachtelte Funktionen sind nicht Teil der ANSI C jedoch they are part ofGnu C.

+0

Welche Bedeutung haben sie, wenn sie Teil von Gnu sind? C –

+0

@Sachin Hilft zu verstehen, warum der C-Code mit verschachtelten Funktionen mit gcc kompiliert werden kann. Die Information hat einen pädagogischen Wert. Darüber hinaus ist die Frage nicht spezifiziert, ob es nur auf C89, C99 oder GNU C – zoli2k

+3

beschränkt ist. Andere von GCC unterstützte Sprachen haben sie (ADA und Pascal, die ich kenne), so dass es wahrscheinlich war, dass es einfach hinzuzufügen war zur C-Implementierung oder dass es zu C hinzugefügt wurde, um in Vorbereitung auf unterstützende Sprachen zu machen, die sie benötigen. – nategoose

2

Wie andere bereits geantwortet haben, unterstützt Standard C keine verschachtelten Funktionen.

Verschachtelte Funktionen werden in einigen Sprachen verwendet, um mehrere Funktionen und Variablen in einen Container einzuschließen (die äußere Funktion), so dass die einzelnen Funktionen (mit Ausnahme der äußeren Funktion) und Variablen nicht von außen gesehen werden.

In C kann dies getan werden, indem solche Funktionen in einer separaten Quelldatei abgelegt werden. Definieren Sie die Hauptfunktion als global und alle anderen Funktionen und Variablen als statisch. Jetzt ist nur die Hauptfunktion außerhalb dieses Moduls sichtbar.

+0

Wenn es eine Rekursion 'äußere'->' verschachtelte-> 'äußere'->' verschachtelte' gibt, dann würde es zwei verschiedene Frames geben, die 'int deklariert_in_Outer' enthalten, so dass Sie' declared_in_outer' nicht einfach als statisch darstellen können global. –

3

Ich erwähne dies, da viele Leute, die in C codieren, jetzt C++ - Compiler (wie Visual C++ und Keil uVision) verwenden, damit Sie diese Möglichkeit nutzen können ...

Obwohl noch nicht in C zulässig, wenn Sie C++ verwenden, können Sie den gleichen Effekt mit den Lambda-Funktionen eingeführt in C++ 11 erreichen:

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

    g(); 
} 
+2

Die Frage war speziell über C, nicht C++ – Virgile

+2

@ Virgile - Und die Frage auch speziell angegeben "Sind verschachtelte Funktionen in einer anderen Sprache erlaubt?". Jons Antwort hat mir geholfen. – user1863152

-1

ist dies nicht eine verschachtelte Funktion in C ? (die Funktion displayAccounts())

Ich weiß, ich hätte die Funktion anders definiert und Variablen übergeben und was nicht, aber irgendwie funktioniert gut, da ich die Konten mehrmals drucken musste.

(snipet von einer Schulaufgabe gemacht) ...

//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

Es ist kein legaler Standard C. Wenn es mit Ihrem Compiler funktioniert, liegt es daran, dass Ihr Compiler eine Erweiterung der C-Standardsprache bereitgestellt hat; In gewissem Sinne kompiliert Ihr Compiler eine andere Sprache, die streng genommen nicht C. –

+0

Vielen Dank für Ihre Eingabe.Ich habe seitdem gelernt, wie man Funktionen deklariert, definiert und benutzt. das ist ein bisschen peinlich, auf>. midnightCoder

1

Ihre zweite Frage zu beantworten, gibt es Sprachen, die verschachtelte Funktionen erlauben die Definition (eine Liste finden Sie hier: nested-functions-language-list-wikipedia).

In JavaScript, das eines der bekanntesten dieser Sprachen, einige Verwendungen von verschachtelten Funktionen (die Verschlüsse genannt werden) ist, sind:

  • Um Klassenmethoden in Konstrukteuren von Objekten zu erstellen.
  • Um die Funktionalität von privaten Klassenmitgliedern zusammen mit Setter und Getters zu erreichen.
  • Den globalen Namensraum nicht zu verschmutzen (das gilt natürlich für jede Sprache).

nur einige zu nennen ...

Verwandte Themen