11
votes

Quel est l'avantage de la fonction statique?

Voir dans un code source de projet J'ai vu la déclaration de Belowows xxx

de sorte qu'il déclarer foo comme fonction statique du pointeur de retour sur INT. Alors, ici, je vous demande quel est le but de la déclaration de fonction comme statique?


0 commentaires

5 Réponses :


2
votes

Il empêche d'autres unités de traduction (fichiers .c) de voir la fonction. Garde les choses propres et bien rangées. Une fonction sans statique est extern par défaut (est visible à d'autres modules).


0 commentaires

1
votes

déclarer une fonction comme statique empêche d'autres fichiers d'y accéder. En d'autres termes, il n'est visible que dans le fichier qu'il a été déclaré dans; une fonction "locale".

Vous pouvez également relier statique (mot-clé de déclaration de fonction, non variable) en C comme privé dans des langages orientés objet.

voir ici pour un exemple.


3 commentaires

La question concerne c . Qu'est-ce qu'une "classe"?


Je suis plus préoccupé par c ... je ne sais pas Classe & C ++


@Keith: Toutes mes excuses - Codage uniquement en Java depuis un mois.



12
votes

Le nom de la fonction n'est pas visible en dehors de l'unité de traduction (fichier source) dans lequel elle est déclarée et ne sera pas en conflit avec une autre fonction foo dans un autre fichier source.

En général, les fonctions doivent probablement être déclarées statique sauf si vous n'avez pas besoin de l'appeler à partir d'un autre fichier source.

(Notez que ce n'est que le nom qui n'est pas visible. Il peut toujours être appelé de n'importe où dans le programme via un pointeur.)


2 commentaires

Quelle est la différence entre marquer une fonction en tant que statique et simplement ne pas l'inclure dans l'en-tête? Ne l'omentait pas de l'en-tête a le même effet? Ou, existe-t-il une raison de ne pas mettre quelque chose dans l'en-tête et de ne pas la marquer aussi statique?


@ALEX: y compris sa déclaration dans l'en-tête le rend visible pour le compilateur et, partant, dans d'autres fichiers source qui incluent cet en-tête. Le faire non- statique fait son nom visible par rapport à la liaison; D'autres fichiers source peuvent y accéder en la déclarant eux-mêmes. En tant que matière de style, que ce soit (a) déclarent que statique, ou (b) déclarer cela non statique et incluent sa déclaration dans le fichier correspondant. (Si C avait un système de module à part entière, des directives comme celle-ci ne seraient pas nécessaires.)



1
votes

Marquage d'une fonction ou d'une variable globale en tant que statique le rend invisible à la liaison une fois que l'unité de traduction actuelle est compilée dans un fichier d'objet.

En d'autres termes, il ne dispose que d'une liaison interne dans l'unité de traduction actuelle. Lorsqu'il n'utilise pas statique ou explicitement à l'aide du spécificateur de classe de stockage extern , le symbole a une liaison externe.


0 commentaires

2
votes

de la norme C99:

6.2.2 Liens des identifiants

Si la déclaration d'une scorie d'une lunette d'application pour un objet ou une fonction contient la classe de stockage Spéci fi er statique, l'identifiant a une liaison interne.

et

Dans l'ensemble des unités de traduction et des bibliothèques qui constitue un programme complet, chacun Déclaration d'une identification particulière avec un lien externe indique le même objet ou fonction. Dans une unité de traduction, chaque déclaration d'une identi fi er avec interne Linkage indique le même objet ou la même fonction. Chaque déclaration d'une identi fi er sans Linkage indique une entité unique.


0 commentaires