En langage C, il n'y a pas de support pour les fonctions imbriquées au niveau de la norme ANSI/ISO. Historiquement, C a été conçu comme un langage compact, proche du matériel, où les fonctions existaient au niveau supérieur de l'unité de traduction (fichier). Contrairement à des langages comme Pascal, C n'autorise pas la déclaration d'une fonction à l'intérieur d'une autre fonction pour des raisons purement syntaxiques.
Le problème rencontré par les programmeurs : on veut souvent utiliser des sous-fonctions locales, visibles uniquement à l'intérieur d'une seule fonction pour encapsuler la logique ou éviter la duplication de code. Le support intégré de l'imbrication permettrait de réduire l'étendue de la visibilité et de rendre le code plus modulaire.
L'un des moyens populaires pour résoudre ce problème est d'utiliser des fonctions statiques (static) au niveau du fichier, ou de passer des pointeurs de fonction vers des fonctions externes, ou d'imiter l'imbrication à travers des structures avec des fonctions de rappel. En cas de nécessité de « fermeture » de contexte, on peut utiliser des structures contenant des pointeurs vers des données (analogue à des closures).
Exemple d'imitation d'une fonction « locale » via le passage d'un pointeur :
#include <stdio.h> static int helper(int x) { return x * x; } void myFunction(void) { printf("Le carré du nombre 5 : %d ", helper(5)); }
Caractéristiques clés :
Peut-on déclarer une fonction interne à l'intérieur d'une autre fonction en C standard et l'appeler ?
Non. En langage C (norme ANSI/ISO), il n'est pas possible de déclarer une fonction à l'intérieur d'une autre fonction. Tenter cela entraînera une erreur de compilation. Certaines extensions non standard (par exemple, de GCC) le permettent, mais de tels programmes ne seront pas portables.
Les fonctions static peuvent-elles remplacer complètement les imbriquées en termes de signification et de sécurité ?
Les fonctions static limitent l'étendue de la visibilité à la fonction-fichier, mais pas à la fonction-bloc. Cela signifie que les fonctions static sont accessibles depuis n'importe quel code dans le même fichier, ce qui ne garantit pas une encapsulation complète comme dans le cas des véritables fonctions imbriquées.
Peut-on réaliser des "closures" à l'intérieur de fonctions imbriquées en C pur ?
Non, il n'y a pas de tel support direct. Cependant, on peut utiliser des structures contenant un pointeur vers des données et une fonction, ce qui rapproche le comportement des closures :
typedef struct { int context; int (*func)(int, int); } closure; int add(int a, int b) { return a + b; } closure cl = { .context = 5, .func = add };
Un développeur utilise une extension GCC – déclare des fonctions internes dans un projet, après quoi le code ne compile pas sur MSVC et d'autres compilateurs.
Avantages :
Inconvénients :
Un développeur limite la portée de toutes les fonctions auxiliaires à static, utilise une structure pour passer le contexte.
Avantages :
Inconvénients :