web-dev-qa-db-fra.com

Fonction imbriquée en C

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?

80

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.

94
James McNellis

Non, ils n'existent pas en C.

Ils sont utilisés dans des langages comme 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 visible publiquement qui implémente une logique complexe en s'appuyant sur une ou plusieurs fonctions imbriquées pour décomposer le problème en éléments 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 à passer explicitement une pile d'état local dans la fonction imbriquée.
32
Marcelo Cantos

Les fonctions imbriquées ne font pas partie de ANSI C , cependant, elles font partie de Gnu C .

18
zoli2k

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)
{
}
15
CB Bailey

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();
}
5
Jon Green

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.

2
PauliL

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 créer des méthodes de classe dans les constructeurs d'objets.
  • Pour atteindre la fonctionnalité des membres de la classe privée avec les setters et les getters.
  • Ne pas polluer l'espace de noms global (cela vaut pour toutes les langues, bien sûr).

pour n'en nommer que quelques-uns ...

1
kyriakosSt

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
0
AnArrayOfFunctions