179 votes

Fonction statique en C

Quel est l'intérêt de rendre une fonction statique en C ?

5voto

user1198898 Points 303

La réponse de pmg est très convaincante. Si vous voulez savoir comment les déclarations statiques fonctionnent au niveau des objets, l'information ci-dessous pourrait vous intéresser. J'ai réutilisé le même programme écrit par pmg et je l'ai compilé dans un fichier .so (shared object).

Le contenu suivant a été obtenu après le transfert du fichier .so dans un fichier quelconque. lisible par l'homme

0000000000000675 f1 : adresse de la fonction f1

000000000000068c f2 : adresse de la fonction f2(staticc)

Notez la différence dans l'adresse de la fonction, cela signifie quelque chose. Pour une fonction qui est déclarée avec une adresse différente, cela peut très bien signifier que f2 vit très loin ou dans un segment différent du fichier objet.

Les linkers utilisent quelque chose appelé PLT (Procedure linkage table) et GOT (Global offsets table) pour comprendre les symboles auxquels ils ont accès.

Pour l'instant, pensez que GOT et PLT lient magiquement toutes les adresses et qu'une section dynamique contient les informations de toutes ces fonctions qui sont visibles par le linker.

Après avoir vidé la section dynamique du fichier .so, nous obtenons un grand nombre d'entrées, mais nous ne sommes intéressés que par les éléments suivants f1 y f2 fonction.

La section dynamique ne contient que des entrées pour f1 à l'adresse 0000000000000675 et non pour f2 !

Num : Valeur Size Type Bind Vis Ndx Name

 9: 0000000000000675    23 FUNC    GLOBAL DEFAULT   11 f1

Et c'est tout ! A partir de cela, il est clair que le linker ne réussira pas à trouver le fichier f2 car elle n'est pas dans la section dynamique du fichier .so.

0voto

Amna Salman Points 1

Lorsqu'il est nécessaire de restreindre l'accès à certaines fonctions, nous utiliserons le mot clé static lors de la définition et de la déclaration d'une fonction.

            /* file ab.c */ 
static void function1(void) 
{ 
  puts("function1 called"); 
} 
And store the following code in another file ab1.c

/* file ab1.c  */ 
int main(void) 
{ 
 function1();  
  getchar(); 
  return 0;   
} 
/* in this code, we'll get a "Undefined reference to function1".Because function 1 is declared static in file ab.c and can't be used in ab1.c */

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