4 votes

Pourquoi toutes les fonctions (à l'exception de main()) sont-elles précédées du mot clé "static" ?

Je lisais quelques fichiers de code source en C et C++ (principalement C)... Je sais que la signification du mot clé 'static' est que les fonctions statiques sont des fonctions qui ne sont visibles que par les autres fonctions du même fichier. Dans un autre contexte, j'ai lu qu'il était intéressant d'utiliser les fonctions statiques dans les cas où nous ne voulons pas qu'elles soient utilisées en dehors du fichier dans lequel elles sont écrites...

Je lisais un fichier de code source comme je l'ai mentionné précédemment, et j'ai vu que TOUTES les fonctions (sauf la principale) étaient statiques... Parce qu'il n'y a pas d'autres fichiers supplémentaires liés au fichier .c du code source principal (pas même les en-têtes), logiquement pourquoi devrais-je mettre static devant toutes les fonctions ? De QUOI devraient-elles être protégées quand il n'y a qu'un seul fichier source ? !

EDIT : IMHO je pense que ces mots clés sont mis juste pour faire paraître le code plus grand et plus lourd

16voto

ephemient Points 87003

Si une fonction est extern (par défaut), le compilateur doit s'assurer qu'il est toujours appelable par son symbole visible de l'extérieur.

Si une fonction est static alors cela donne au compilateur plus de flexibilité. Par exemple, l'optimiseur peut décider de mettre en ligne une fonction ; avec static le compilateur n'a pas besoin de générer une copie supplémentaire hors ligne. De plus, la table des symboles sera plus petite, ce qui accélérera peut-être aussi le processus de liaison.

De plus, c'est une bonne habitude à prendre.

5voto

Marc Gravell Points 482669

Il est difficile de le deviner isolément, mais je suppose qu'il a été écrit par quelqu'un qui suppose que plus de fichiers pourrait sera ajouté à un moment donné (ou ce fichier inclus dans un autre projet), ce qui donne l'accès le moins nécessaire pour que le code fonctionne. Essentiellement en limitant l'API publique au minimum.

3voto

DigitalRoss Points 80400

Mais il y a d'autres fichiers liés à votre module principal.

En fait, il y en a des centaines, voire des milliers, dans les bibliothèques. La plupart d'entre eux ne seront pas sélectionnés pour un petit programme, mais tous les symboles sont analysés par l'éditeur de liens. Une collision entre un symbole dans le programme principal et un symbole exporté d'une bibliothèque ne causera pas de dommage en soi, mais pensez au problème de nommer accidentellement quelque chose strcpy() pourrait causer.

En outre, il n'y a probablement pas de mal à s'habituer aux styles les plus courants.

3voto

Jonathan Leffler Points 299946

Selon une règle de codage que je respecte, toute fonction (autre que la fonction main() ) qui est visible en dehors de son fichier source nécessite une déclaration, et cette déclaration doit être dans un en-tête. J'évite d'écrire des déclarations "extern" pour les fonctions dans mes fichiers sources si possible, et c'est presque toujours possible.

Si une fonction n'est utilisée que dans un seul fichier source, elle doit être statique. Cela facilite grandement sa modification ; vous savez que le seul endroit où vous devez regarder pour voir comment elle est utilisée est le fichier source que vous avez devant vous (à moins que vous n'ayez l'habitude d'inclure des fichiers '.c' dans d'autres fichiers '.c' - ce qui est aussi une mauvaise habitude qui devrait être rompue maintenant).

J'utilise GCC pour m'aider à faire respecter la règle du codage :

gcc -m64 -Wall -Wextra -std=c99 -Wmissing-prototypes -Wstrict-prototypes

C'est une collection de drapeaux assez typique ; j'utilise parfois -std=c89 au lieu de -std=c99 ; j'utilise parfois -m32 au lieu de -m64 ; je n'utilise pas toujours -Wextra (mais mon code va dans ce sens). I toujours utiliser -Wmissing-prototypes y -Wstrict-prototypes pour s'assurer que chaque fonction externe est déclarée avant d'être définie ou utilisée (et que chaque fonction statique est soit déclarée soit définie avant d'être utilisée). J'utilise occasionnellement -Werror (donc si la compilation émet un avertissement, la compilation échoue). Je pourrais l'utiliser plus que je ne le fais puisque mon code compile sans avertissement - ou est corrigé pour qu'il le fasse.

Donc, vous pourriez facilement avoir regardé mon code. Dans mon code, les seules fonctions qui sont exposées - même dans les programmes à fichier source unique - sont les fonctions qui sont déclarées dans un en-tête, ce qui signifie qu'elles font partie de l'interface externe du module que le fichier source représente.

2voto

anthares Points 5536

Il se peut que l'auteur prenne des précautions. Par exemple, si quelqu'un d'autre utilise ce fichier comme source en l'incluant dans son fichier principal.

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