But de la fonction statique en C

Je sais que le nom de cette fonction statique n’est visible que dans le fichier (unité de traduction) dans lequel elle est déclarée. Cela rend possible l’encapsulation.

Mais la fonction statique est généralement déclarée dans le fichier source car si vous le faites dans le fichier d’en-tête, vous pouvez vous retrouver avec plusieurs implémentations (ce qui, je pense, n’est pas l’intention de static ).

Exemple:

principal c

 #include "functions.h" int main() { FunctionA(); FunctionB(); // Can't call regardless of "static". return 0; } 

functions.h

 #ifndef FUNCTIONS_H #define FUNCTIONS_H void FunctionA(); #endif /* FUNCTIONS_H */ 

fonctions.c

 #include "functions.h" #include  static void FunctionB(); // Same whether "static" is used or not. void FunctionA() { printf("A"); } void FunctionB() { printf("B"); } 

Alors, quand la static est-elle utile?

static dit que la fonction a un lien interne. Cela signifie qu’il ne sera pas lié à d’autres utilisations du même identifiant dans d’autres fichiers (unités de traduction).

Par exemple, supposons que dans Tree.c j’ai une fonction qui opère sur des structures d’arbre, et que j’ai un sous-programme local appelé UpdateNode qui opère sur une partie de l’arbre. Supposons en outre que, dans List.c , j’ai une fonction qui opère sur les structures List et qu’il existe également un sous-programme local appelé UpdateNode qui UpdateNode uniquement aux structures List, et non aux structures Tree.

Si je laissais ces deux sous-programmes avec une liaison externe, l’éditeur de liens se plaindrait de plusieurs définitions. En les marquant avec une liaison interne avec static , ce problème est évité.

C’est utile quand:

  1. La fonction ne doit pas être visible à l’extérieur de l’unité de traduction.
  2. La visibilité de la fonction doit être considérée comme “masquée” (lorsque l’éditeur de liens dynamic est utilisé).
  3. Pour que le compilateur prévienne des fonctions inutilisées.
  4. Avoir des fonctions sortingviales en ligne, auquel cas une fonction statique est définie dans l’en-tête. Une meilleure alternative aux macros pour le code pré-C99.

Ou une combinaison de tout ce qui précède. Il y a peut-être autre chose auquel je n’ai pas immédiatement pensé.

En plus de toutes les réponses, j’aimerais append ce que MISRA C dit à propos du mot clé statique.

Règle 8.8 Le spécificateur de classe de stockage statique doit être utilisé dans toutes les déclarations d’objects et de fonctions ayant une liaison interne.

La norme stipule que si un object ou une fonction est déclaré avec le spécificateur de classe de stockage extern et qu’une autre déclaration de l’object ou de la fonction est déjà visible, le lien est celui spécifié par la déclaration précédente. Cela peut prêter à confusion car on pourrait s’attendre à ce que le spécificateur de classe de stockage externe crée une liaison externe. Le spécificateur de classe de stockage statique doit donc être appliqué de manière cohérente aux objects et aux fonctions avec une liaison interne.

Et celui-là

Règle 8.10 Une fonction inline doit être déclarée avec la classe de stockage statique.

Si une fonction en ligne est déclarée avec une liaison externe mais n’est pas définie dans la même unité de traduction, le comportement est indéfini.

En d’autres termes, utilisez static mot clé static chaque fois que cela est possible