Nein, und es gibt mindestens einen Grund, warum es die Dinge komplizieren würde, dies zuzulassen. Verschachtelte Funktionen haben in der Regel Zugriff auf den umgebenden Bereich. Dadurch kann der "Stack" nicht mehr mit einer Stapel-Datenstruktur dargestellt werden. Stattdessen wird ein vollständiger Baum benötigt.
Betrachten Sie den folgenden Code, der tatsächlich in gcc kompiliert, wie KennyTM vorschlägt.
#include
typedef double (*retdouble)();
retdouble wrapper(double a) {
double square() { return a * a; }
return square;
}
int use_stack_frame(double b) {
return (int)b;
}
int main(int argc, char** argv) {
retdouble square = wrapper(3);
printf("Erwarte 9 tatsächlich %f\n", square());
printf("Erwarte 3 tatsächlich %d\n", use_stack_frame(3));
printf("Erwarte 16 tatsächlich %f\n", wrapper(4)());
printf("Erwarte 9 tatsächlich %f\n", square());
return 0;
}
Ich habe das platziert, was die meisten Leute erwarten würden, gedruckt zu werden, aber tatsächlich wird Folgendes gedruckt:
Erwarte 9 tatsächlich 9.000000
Erwarte 3 tatsächlich 3
Erwarte 16 tatsächlich 16.000000
Erwarte 9 tatsächlich 16.000000
Beachten Sie, dass die letzte Zeile die Funktion "square" aufruft, aber der Wert "a", auf den zugegriffen wird, wurde während des Aufrufs von "wrapper(4)" geändert. Dies liegt daran, dass für jede Instanz von "wrapper" kein separater "Stack"-Rahmen erstellt wird.
Beachten Sie, dass diese Art von verschachtelten Funktionen in anderen Sprachen, die sie unterstützen, wie Lisp und Python (und sogar in neueren Versionen von Matlab), tatsächlich ziemlich häufig sind. Sie führen zu sehr leistungsstarken funktionalen Programmierfähigkeiten, schließen jedoch die Verwendung eines Stacks zur Aufnahme lokaler Bereichsrahmen aus.