Peut-on avoir une fonction imbriquée en C? Quelle est l'utilisation des fonctions imbriquées? S'ils existent en C, leur implémentation diffère-t-elle d'un compilateur à l'autre?
Vous ne pouvez pas définir une fonction dans une autre fonction dans la norme C.
Vous pouvez déclarer une fonction à l'intérieur d'une fonction, mais ce n'est pas une fonction imbriquée.
gcc a ne extension de langage qui autorise les fonctions imbriquées . Ils ne sont pas standard et en tant que tels dépendent entièrement du compilateur.
Non, ils n'existent pas en C.
Ils sont utilisés dans des langages comme Pascal pour (au moins) deux raisons:
Les fonctions imbriquées ne font pas partie de ANSI C , cependant, elles font partie de Gnu C .
Non, vous ne pouvez pas avoir de fonction imbriquée dans C
. Le plus proche est de déclarer une fonction dans la définition d'une autre fonction. La définition de cette fonction doit cependant apparaître en dehors de tout autre corps de fonction.
Par exemple.
void f(void)
{
// Declare a function called g
void g(void);
// Call g
g();
}
// Definition of g
void g(void)
{
}
Je mentionne cela car de nombreuses personnes codant en C utilisent maintenant des compilateurs C++ (tels que Visual C++ et Keil uVision) pour le faire, donc vous pourrez peut-être utiliser cela ...
Bien que cela ne soit pas encore autorisé en C, si vous utilisez C++, vous pouvez obtenir le même effet avec les fonctions lambda introduites dans C++ 11:
void f()
{
auto g = [] () { /* Some functionality */ }
g();
}
Comme d'autres l'ont répondu, le standard C ne prend pas en charge les fonctions imbriquées.
Les fonctions imbriquées sont utilisées dans certains langages pour enfermer plusieurs fonctions et variables dans un conteneur (la fonction externe) afin que les fonctions individuelles (à l'exclusion de la fonction externe) et les variables ne soient pas vues de l'extérieur.
Dans C , cela peut être fait en plaçant ces fonctions dans un fichier source séparé. Définissez la fonction principale comme globale et toutes les autres fonctions et variables comme statique . Maintenant, seule la fonction principale est visible en dehors de ce module.
Pour répondre à votre deuxième question, il existe des langages qui permettent de définir des fonctions imbriquées (une liste peut être trouvée ici: nested-functions-language-list-wikipedia ).
En JavaScript, qui est l'un des plus célèbres de ces langages, certaines utilisations des fonctions imbriquées (appelées fermetures) sont:
pour n'en nommer que quelques-uns ...
Ou vous pouvez être intelligent à ce sujet et utiliser le préprocesseur à votre avantage (source.c
):
#ifndef FIRSTPASS
#include <stdio.h>
//here comes your "nested" definitions
#define FIRSTPASS
#include "source.c"
#undef FIRSTPASS
main(){
#else
int global = 2;
int func() {printf("%d\n", global);}
#endif
#ifndef FIRSTPASS
func();}
#endif