In der Programmiersprache C gibt es keine Unterstützung für geschachtelte (nested) Funktionen auf der Ebene des ANSI/ISO-Standards. Historisch gesehen wurde C als kompakte Sprache konzipiert, die nah an der Hardware ist, wo Funktionen auf der obersten Ebene der Übersetzungseinheit (Datei) existieren. Im Gegensatz zu Sprachen wie Pascal erlaubt C nicht das Deklarieren einer Funktion innerhalb einer anderen Funktion rein syntaktisch.
Ein Problem, das Programmierer häufig haben: Oft möchte man lokale Hilfsfunktionen verwenden, die nur innerhalb einer Funktion sichtbar sind, um Logik zu kapseln oder Code-Duplizierung zu vermeiden. Eine eingebaute Unterstützung für Verschachtelung könnte den Sichtbarkeitsbereich verringern und den Code modularer machen.
Eine beliebte Lösung besteht darin, statische (static) Funktionen auf Datei-Ebene zu verwenden, oder Funktionszeiger auf externe Funktionen zu übergeben, oder die Verschachtelung durch Strukturen mit Callback-Funktionen zu imitieren. Bei Bedarf an einem "Closure"-Kontext können Strukturen mit Datenzeigern verwendet werden (analog zu Closures).
Beispiel für die Imitation einer "lokalen" Funktion durch Übergabe eines Zeigers:
#include <stdio.h> static int helper(int x) { return x * x; } void myFunction(void) { printf("Quadrat der Zahl 5: %d\n", helper(5)); }
Wichtige Merkmale:
Kann man eine innere Funktion innerhalb einer anderen Funktion im Standard C definieren und sie aufrufen?
Nein. In der Programmiersprache C (ANSI/ISO-Standard) kann man keine Funktion innerhalb einer anderen Funktion deklarieren. Der Versuch dazu führt zu einem Kompilierungsfehler. Einige nicht standardisierte Erweiterungen (z. B. bei GCC) erlauben dies, aber solche Programme sind nicht portierbar.
Können static-Funktionen geschachtelte Funktionen in Bezug auf Bedeutung und Sicherheit vollständig ersetzen?
Static-Funktionen schränken den Gültigkeitsbereich auf die Datei-Funktion ein, jedoch nicht auf die Block-Funktion. Das bedeutet, dass static-Funktionen aus jedem Code in derselben Datei zugänglich sind, was keine vollständige Kapselung wie bei echten geschachtelten Funktionen garantiert.
Kann man "Closures" in geschachtelten Funktionen in reinem C implementieren?
Nein, direkt gibt es dafür keine Unterstützung. Man kann jedoch Strukturen verwenden, die einen Zeiger auf Daten und eine Funktion enthalten, was das Verhalten zu einem Closure näherbringt:
typedef struct { int context; int (*func)(int, int); } closure; int add(int a, int b) { return a + b; } closure cl = { .context = 5, .func = add };
Ein Entwickler verwendet die GCC-Erweiterung — deklariert innere Funktionen im Projekt, wonach der Code in MSVC und anderen Compilern nicht kompiliert.
Vorteile:
Nachteile:
Ein Entwickler beschränkt den Gültigkeitsbereich aller Hilfsfunktionen auf static und verwendet eine Struktur zur Übermittlung des Kontexts.
Vorteile:
Nachteile: