Quel est l'intérêt de rendre une fonction statique en C ?
Réponses
Trop de publicités?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.
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 */
- Réponses précédentes
- Plus de réponses