Pouvons-nous avoir une fonction imbriquée dans C? À quoi servent les fonctions imbriquées? S'ils existent en C, leur implémentation diffère-t-elle d'un compilateur à l'autre?
Pouvons-nous avoir une fonction imbriquée dans C? À quoi servent les fonctions imbriquées? S'ils existent en C, leur implémentation diffère-t-elle d'un compilateur à l'autre?
Réponses:
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 une 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 dans C.
Ils sont utilisés dans des langages comme Pascal pour (au moins) deux raisons:
Fonctions emboîtées ne font pas partie de la norme ANSI C , cependant, ils font partie de Gnu C .
Non, vous ne pouvez pas avoir de fonction imbriquée C
. Le plus proche que vous puissiez approcher 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)
{
}
g
est visible plus tard dans le fichier, cette déclaration est dans la portée du reste de l'unité de traduction. De plus, vous pouvez appeler des fonctions en C sans déclaration visible dans la portée même si cela n'est pas conseillé.
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, vous pourrez donc 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, la norme 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) de sorte que les fonctions individuelles (à l'exclusion de la fonction externe) et les variables ne soient pas vues de l'extérieur.
En C , cela peut être fait en plaçant ces fonctions dans un fichier source distinct. Définissez la fonction principale comme globale et toutes les autres fonctions et variables comme statiques . Désormais, seule la fonction principale est visible en dehors de ce module.
outer
-> nested
-> outer
-> nested
, alors il y aurait deux cadres différents int declared_in_outer
, donc vous ne pouvez pas simplement les mettre declared_in_outer
comme un global statique.
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, l'une des fonctions imbriquées (appelées fermetures) peut être:
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
n'est-ce pas une fonction imbriquée dans C? (la fonction displayAccounts ())
Je sais que j'aurais pu définir la fonction différemment et passer des variables et ce qui ne fonctionne pas mais de toute façon fonctionne bien car j'avais besoin d'imprimer les comptes plusieurs fois.
(extrait tiré d'un devoir scolaire) ...
//function 'main' that executes the program.
int main(void)
{
int customerArray[3][3] = {{1, 1000, 600}, {2, 5000, 2500}, {3, 10000, 2000}}; //multidimensional customer data array.
int x, y; //counters for the multidimensional customer array.
char inquiry; //variable used to store input from user ('y' or 'n' response on whether or not a recession is present).
//function 'displayAccounts' displays the current status of accounts when called.
void displayAccounts(void)
{
puts("\t\tBank Of Despair\n\nCustomer List:\n--------------");
puts("Account # Credit Limit\t Balance\n--------- ------------\t -------");
for(x = 0; x <= 2; x++)
{
for(y = 0; y <= 2; y++)
printf("%9d\t", customerArray[x][y]);
puts("\n");
}
}
displayAccounts(); //prints accounts to console.
printf("Is there currently a recession (y or n)? ");
//...
return 0;
}