Meilleure réponse
Comme nous savons que les fonctions définies dans un fichier sont accessibles dans un autre fichier. Si nous voulons restreindre que les fonctions ne doivent pas être appelées dans un autre fichier, nous pouvons les rendre statiques.
Par conséquent, les fonctions statiques sont les fonctions appelables dans le même fichier où ils définissent .
Nous pouvons définir une fonction statique en utilisant la syntaxe suivante
static return\_type function\_name(arguments)
{
function\_body;
}
Voici une fonction pour trouver la racine carrée dun nombre donné
static long int getSquare(int num){
return (num*num);
}
Programme pour illustrer un exemple de fonction statique en langage C
#include
//static function definition
static long int getSquare(int num){
return (num*num);
}
int main()
{
int num;
printf("Enter an integer number: ");
scanf("\%d",&num);
printf("Square of \%d is \%ld.\n",num,getSquare(num));
return 0;
}
Sortie
Enter an integer number: 36
Square of 36 is 1296.
Pourquoi les fonctions statiques sont nécessaires?
Puisque les fonctions sont utilisées pour réutiliser le code (cest à dire le code que vous avez écrit peut accéder dans un autre fichier en les mettant dans les fonctions ), mais lorsque vous voulez en définir fonctions qui ne devraient pas être partageables (appelables) dans un autre fichier .
les fonctions statiques sont également utiles pour gérer le problème de conflit de déclaration – sil y a deux fonctions dans deux fichiers différents avec le même nom, la déclaration de fonction sera en conflit. Nous pouvons les rendre statiques.
Pour répondre à ce type dexigence, nous pouvons les rendre statiques .
Réponse
Réponse courte: Cela signifie que le nom de la fonction nest visible et appelable que dans le fichier en cours de compilation. Les autres fichiers compilés séparément ne verront pas le nom de la fonction ou ne pourront pas lappeler. Par la suite, ils peuvent avoir leurs propres fonctions statiques du même nom. Cela évite les conflits de noms dans les inclusions de fichiers et dans les liens entre les fichiers objets et les bibliothèques binaires.
Il existe 4 classes de stockage différentes pour le stockage en C.
- auto (automatique) ceci est « normal » (par défaut) et utilise le mot-clé auto , mais est généralement non spécifié car il sagit du registre par défaut
- register est un «indice» pour le compilateur quil peut optimiser le code créé pour stocker le valeur dans un registre cpu pour un traitement plus rapide. Le compilateur essaiera sil le peut de le faire, mais si ce nest pas le cas, cest la même chose que normal.
- extern external signifie quil y a une seule variable globale portant ce nom, et tous les fichiers la déclarant comme extern utiliseront ce stockage. Un fichier le déclarera globalement comme une variable régulière, où il sera alloué lors de la compilation.
- static spécificateur de stockage dans les fichiers source C signifie quelques choses différentes.
- Le nom et le stockage ne sont pas exportés vers dautres fichiers compilés en même temps. Cela permet à chaque fichier davoir des noms identiques qui ne sont pas en conflit.
- Le stockage créé pour la variable est créé dans la zone de stockage statique et initialisé à 0 au démarrage du programme, ou avec une valeur explicite.
- Linitialisation dune variable statique est effectuée une seule fois . (au moment de la compilation). Par la suite, les valeurs attribuées sont conservées pendant la durée de vie du programme ou jusquà ce quelles soient modifiées par une affectation.
- le stockage statique déclaré à lintérieur des fonctions a une portée fonctionnelle, mais une allocation statique. Cela signifie que le stockage est permanent pour la durée de vie du programme et nest pas créé lorsque le cadre de la pile de fonctions est alloué pour lappel de fonction. Il conserve sa valeur grâce à plusieurs appels de fonction. Le stockage persiste même si le bloc de code est récupéré de la pile après son retour.
int accumulate( unsigned int x)
{
static unsigned int acc = 0;
acc = acc + x;
return acc;
}
- Ce qui précède renverrait un compte courant de son entrée, car le var acc conserverait sa valeur à chaque appel. acc sera initialisé à 0 au chargement du programme.
- les variables statiques ont des adresses en RAM, et vous pouvez les envoyer dans des fonctions par référence ou valeur.
- Les variables de plus petite portée (définies dans des fonctions) qui ont le même nom quune variable statique en dehors de cette portée masquent la variable statique, comme toute autre.
- les variables statiques peuvent ne pas être exportés vers des fichiers externes, de sorte que les valeurs peuvent être perdues dans les domaines de compilation si elles ne sont pas explicitement envoyées en tant que paramètres par valeur. (gotcha!)
- Comme 4, les autres fichiers ne peuvent pas accéder aux variables statiques comme extern comme ils le pourraient avec variables automatiques (normales). Cela ne fonctionnera pas, vous obtiendrez des programmes bogués qui plantent, et le compilateur pourrait être dupé et le manquer.
- Les variables statiques peuvent être initialisées à leur déclaration, mais la valeur dinitialisation doit être une expression constante, évaluable au moment de la compilation, pas une valeur qui ne soit pas calculable au moment de la compilation. Vous ne pouvez pas initialiser une variable statique avec une valeur inconnue telle quune variable de paramètre, ou le résultat dun appel de fonction qui ne sest pas produit au moment de la compilation.
int accumulate( unsigned int x)
{
/* ERROR x is not a compile-time constant. */
static unsigned int acc = x;
static unsigned int acc = 0; /* OK */
acc = acc + x;
return acc;
}
Fonctions statiques
- Une fonction statique en C a une portée de fichier . Une fonction statique ne peut pas être appelé par un autre fichier dans la même unité de traduction. Une unité de traduction est tout le code source entrant dans un compilateur après le prétraitement pour être compilé en une seule fois. Les fonctions statiques ne peuvent pas accéder aux variables statiques ou appeler des fonctions statiques à partir dautres fichiers. Donc, si vous souhaitez limiter laccès à une fonction au fichier courant, vous pouvez le rendre statique. Une seule fonction de ce nom peut exister dans ce fichier (qui vaut également pour les fonctions régulières), si souvent les fonctions utilitaires sont placées dans des fichiers den-tête, pour être incluses dans plusieurs compilations, et len-tête est protégé par des commandes de pré-processeur pour ne pas être inclus dans une unité de compilation plus dune fois. Tous les en-têtes de bibliothèque C standard sont pleins de fonctions globales, et celles-ci sont protégées de sorte quelles ne soient compilées quune seule fois dans une compilation, et sont des fonctions globales. Pas de fonctions statiques. On dit que les fonctions statiques ont un « lien interne » , ce qui signifie qu’elles ne peuvent pas être vues dans d’autres modules compilés, même si elles sont liées dans le même programme ou bibliothèque final. Si une fonction nest pas statique alors en C cette fonction est une fonction globale et sera disponible dans tout le programme globalement. Cela signifie que vous ne pouvez avoir quune seule fonction appelée print dans tout le programme . Pour contourner ce problème, rendez vos fonctions et variables statiques et vous naurez pas de conflit de noms.
- Les fonctions sont globales et externes par défaut , sauf dans le fichier dans lequel elles sont définies. Vous ne voyez donc pas le mot extern utilisé en source C avec des fonctions, car il est déjà là implicitement. Cest pourquoi vous pouvez appeler des fonctions normales à partir de nimporte quel fichier de lunité de traduction. On dit quils ont une signification lien externe une fois liés, ils sont visibles et appelables par nimporte quel fichier du module, ou par tout autre module du programme lié.
- Une déclaration de prototype de fonction est une «définition provisoire», cest-à-dire implicitement extern . Le code après la première lecture de la déclaration du prototype peut appeler la fonction tant que la définition complète existe dans le code final. Cela signifie quune « définition réelle » doit réellement exister ou la phase de liaison échouera. Cest pourquoi les en-têtes en C ne contiennent généralement pas le code source des fonctions, ils ne sont pas nécessaires à la compilation, mais sont en phase de liaison.
- Une déclaration de prototype de fonction statique est une «définition provisoire», qui nest explicitement pas externe . La définition complète doit être présente dans lunité de traduction actuelle (compilée en même temps) ou la compilation échouera. Les compilateurs C modernes synthétiseront le prototype à partir de la définition tant quil se produit avant un appel de fonction réel. Les soi-disant «déclarations avant» permettent lutilisation de définitions provisoires avec la définition réelle plus tard, et ont diverses utilisations dans les structures de données et dans lorganisation des bibliothèques.
- La première définition dune signature de fichier est celle utilisée pour lensemble du programme, y compris statique ou externe. Une fois quune fonction est définie pour la première fois, si elle est déclarée initialement comme statique, elle sera toujours statique, même si elle est redéfinie ultérieurement sans le mot-clé static. Si est initialement déclaré extern (par défaut), il ne peut pas être redéfini comme statique.
static void f(int); /* Function is always static */
...
void f(int x) { ….} /* static , not exported, no error */
void f(int); /* Function is always global */
...
static void f(int x) { ….} /*ERROR NOT STATIC */
clang: "error: static declaration of "f" follows non-static declaration"
- Les fonctions définies dans la portée du bloc ne peuvent pas être déclarées statiques. Seules les définitions de fonctions statiques de portée de fichier peuvent être créées en dehors de tout bloc. Cela a du sens dun point de vue logique, car la portée du fichier ne peut pas être rendue plus petite que le fichier entier. Définissez donc une fonction statique, ou du moins le prototype, très tôt dans le fichier.
- Statique fait référence à la fonction, pas au type de retour . Vous pouvez placer le mot-clé static après le type de retour si vous le souhaitez, mais si vous le faites, vous êtes bizarre et vous dérouterez les gens. La valeur renvoyée nest pas statique, la fonction lest.
- Une définition de fonction statique ne remplacera pas global défini avant lui dans le même fichier ou dans un fichier inclus. Si une fonction portant ce nom est déjà définie, vous ne pouvez pas la redéfinir avec une fonction statique ou une fonction du même nom.
C ne renomme pas en interne les fonctions et les variables comme le fait C ++, il ne prend donc pas en charge la surcharge de fonctions. C ++ «mangle» les noms de fonction avec un nom codé indiquant plusieurs types de données supplémentaires, par exemple si elle fait partie dune classe ou quels sont ses paramètres, etc. Donc, en C sans le mot-clé static, vous ne pouvez avoir quune fonction de chaque nom unique dans un programme, quel que soit le nombre de fichiers ou de bibliothèques quil implique.
Alors, que faites-vous si vous voulez changer votre fonction pour une fonction déjà existante?
Eh bien, ce que font les codeurs C intelligents, cest de trouver un nom différent pour leur fonction. Mais il existe un moyen de «tromper» le compilateur en changeant de manière préventive le texte source avec le préprocesseur.
Exemple: Un idiot a écrit une fonction int sort( char** Array)
dans sa bibliothèque et la rendu global, et il est bogué et ne fait pas exactement ce que vous voulez, car il fait que les nombres viennent après les lettres ou quelque chose du genre, et les mots T sont toujours les premiers, pour une raison quelconque.
Vous voulez utilisez la bibliothèque mais devez corriger la fonction, et vous navez que les en-têtes et la bibliothèque compilée, pas le code source.
OK> donc un en-tête « spécial » est créé qui remplace toute linstance de » sort ”avec“ bad\_sort ”dans len-tête, puis importe votre code et remplace toutes les instances de“ sort ”par“ good\_sort ”. «Good\_sort» est défini complètement dans good\_sort.h, mais est marqué comme statique, il nest donc connu que dans le fichier dans lequel il est inclus.
/* good\_sort.h */
#ifndef \_GOOD\_SORT\_H
#define \_GOOD\_SORT\_H
static int good\_sort(char** Array)
{
... //code here
return numsorted;
}
#endif
Une parenthèse de garde de définition est ajoutée pour sassurer quelle nest pas incluse deux fois.
/*-----------------------------------*/
/* program.c */
#include "Trumpsort.h" /* The buggy library header */
...
#ifdef sort
#undef sort /* undefine the sort function name as reserved */
#define sort bad\_sort /* replace the name */
#include "good\_sort.h" /* your fixed version */
#endif
#define sort good\_sort /* replace the name in this file */
/* rest of file */
Un peu de merde mais lidée est dappeler votre fonction au lieu du mauvais par renam le mettre à «good\_sort» et lappeler à la place. (mais uniquement dans ce fichier – static ).