In de programmeertaal C is er geen ondersteuning voor geneste functies op het niveau van de ANSI/ISO-standaard. Historisch gezien is C ontworpen als een compacte taal, dicht bij de hardware, waar functies bestaan op het hoogste niveau van de vertaaleenheid (bestand). In tegenstelling tot talen zoals Pascal, staat C niet toe dat een functie binnen een andere functie wordt gedeclareerd, puur syntactisch.
Het probleem dat programmeurs tegenkomen: vaak willen ze lokale hulpfuncties gebruiken die alleen zichtbaar zijn binnen één functie voor het encapsuleren van logica of het vermijden van code duplicatie. Ingebouwde ondersteuning voor genesting zou de zichtbaarheid verkleinen en de code modulairder maken.
Een populaire oplossing is het gebruik van statische (static) functies op het niveau van het bestand, of het doorgeven van pointers naar externe functies, of het imiteren van genesting via structuren met callback-functies. Bij de noodzaak van "closures" van de context kunnen structuren met pointers naar gegevens (analogous to closure) worden toegepast.
Voorbeeld van het imiteren van een "lokale" functie door het doorgeven van een pointer:
#include <stdio.h> static int helper(int x) { return x * x; } void myFunction(void) { printf("Kwadraat van het getal 5: %d\n", helper(5)); }
Belangrijke punten:
Kan je een interne functie definiëren binnen een andere functie in standaard C en deze aanroepen?
Nee. In de programmeertaal C (ANSI/ISO-standaard) is het niet mogelijk een functie binnen een andere functie te declareren. Pogingen hiertoe leiden tot een compilatiefout. Sommige niet-standaard extensies (zoals die bij GCC) staan dit toe, maar zulke programma's zullen niet draagbaar zijn.
Kunnen static-functies geneste functies volledig vervangen qua betekenis en veiligheid?
Static-functies beperken de zichtbaarheid tot function-file, maar niet tot function-block. Dit betekent dat static-functies toegankelijk zijn vanuit elke code in hetzelfde bestand, wat geen volledige encapsulatie garandeert zoals bij echte geneste functies.
Kan je "closures" realiseren in geneste functies in pure C?
Nee, er is geen directe ondersteuning. Je kunt echter structuren gebruiken die een pointer naar gegevens en een functie bevatten, wat het gedrag kan benaderen van closure:
typedef struct { int context; int (*func)(int, int); } closure; int add(int a, int b) { return a + b; } closure cl = { .context = 5, .func = add };
Een ontwikkelaar gebruikt de GCC-extensie — declareert interne functies in het project, waarna de code niet compileert op MSVC en andere compilers.
Voordelen:
Nadelen:
Een ontwikkelaar beperkt de zichtbaarheid van alle hulpfuncties tot static en gebruikt een structuur voor het doorgeven van context.
Voordelen:
Nadelen: