104 votes

Fonction imbriquée en C

Peut-on avoir une fonction imbriquée en C ? Quelle est l'utilité des fonctions imbriquées ? Si elles existent en C, leur implémentation diffère-t-elle d'un compilateur à l'autre ?

1 votes

Il semble que ce soit un doublon : stackoverflow.com/questions/1348095/

124voto

James McNellis Points 193607

Vous ne pouvez pas définir une fonction dans une autre fonction en C standard.

Vous pouvez déclarer une fonction à l'intérieur d'une fonction, mais ce n'est pas une fonction imbriquée.

gcc a une extension du langage qui permet les fonctions imbriquées . Ils ne sont pas standard, et en tant que tels, ils dépendent entièrement du compilateur.

41voto

Marcelo Cantos Points 91211

Non, ils n'existent pas en C.

Ils sont utilisés dans des langages comme le Pascal pour (au moins) deux raisons :

  1. Ils permettent une décomposition fonctionnelle sans polluer les espaces de noms. Vous pouvez définir une seule fonction publiquement visible qui implémente une logique complexe en vous appuyant sur une ou plusieurs fonctions imbriquées pour décomposer le problème en morceaux logiques plus petits.
  2. Ils simplifient le passage des paramètres dans certains cas. Une fonction imbriquée a accès à tous les paramètres et à certaines ou à toutes les variables dans la portée de la fonction externe, de sorte que la fonction externe n'a pas besoin de passer explicitement un tas d'états locaux dans la fonction imbriquée.

22voto

zoli2k Points 1897

Les fonctions imbriquées ne font pas partie de ANSI C Cependant, ils font partie de Gnu C .

0 votes

Quelle importance s'ils font partie de Gnu C ?

4 votes

@Sachin Aide à comprendre pourquoi le code C avec des fonctions imbriquées peut être compilé avec gcc. L'information a une valeur éducative. De plus, la question ne précise pas si elle est limitée uniquement au C89, C99 ou GNU C.

4 votes

D'autres langages supportés par GCC les ont (ADA et Pascal à ma connaissance), il est donc probable que soit il était facile de les ajouter à l'implémentation du C, soit ils ont été ajoutés au C afin de se préparer à supporter des langages qui en ont besoin.

19voto

Charles Bailey Points 244082

Non, vous ne pouvez pas avoir une fonction imbriquée dans C . Le plus proche que vous puissiez faire est de déclarer une fonction à l'intérieur de 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)
{
}

8 votes

Si la fonction g est déclarée de cette manière, quelle sera sa portée ?

6 votes

La déclaration a la même portée que toute autre déclaration, donc dans ce cas jusqu'à la fin de la fonction. Bien sûr, une fois que la définition de g est visible plus tard dans le fichier, cette déclaration est dans la portée du reste de l'unité de traduction. En outre, vous puede appeler des fonctions en C sans déclaration visible dans la portée, même si ce n'est pas conseillé.

3voto

PauliL Points 830

Comme d'autres l'ont répondu, le C standard ne supporte pas 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) de sorte que les fonctions individuelles (à l'exception de la fonction externe) et les variables ne sont pas visibles de l'extérieur.

En C Cela peut être fait en plaçant ces fonctions dans un fichier source séparé. Définissez la fonction principale en tant que globale et toutes les autres fonctions et variables en tant que statique . Maintenant, seule la fonction principale est visible en dehors de ce module.

0 votes

S'il y a récursion outer -> nested -> outer -> nested alors il y aurait deux cadres différents qui tiendraient int declared_in_outer donc vous ne pouvez pas simplement mettre declared_in_outer comme un global statique.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X