L'objectif entier et entier de static
est de déclarer qu'une variable est privée au fichier source qu'il est déclaré dans. Ainsi, il fait précisément son travail en empêchant une connexion d'un externe.
Gardez à l'esprit qu'il ya quatre saveurs de définition de la variable fichier entier:
int blah = 0;
- bla est défini dans ce fichier et accessible à partir d'autres fichiers. Les définitions dans d'autres fichiers sont des doublons et conduiront à des erreurs.
extern int blah;
- blah doit être défini ailleurs et référencé à partir de ce fichier.
int blah;
- Ceci est l'équivalent moral de FORTRAN COMMON
. Vous pouvez avoir n'importe quel nombre de ces fichiers, et ils sont tous résolus par l'éditeur de liens à un partagé int
. (*)
static int blah;
(éventuellement avec un initialiseur) - Ceci est statique. C'est complètement privé dans ce fichier. Il n'est pas visible aux externes dans d'autres fichiers, et vous pouvez avoir de nombreux fichiers différents qui déclarent tous static TYPE blah;
, et ils sont tous différents.
Pour les puristes du public: 'file' = unité de compilation.
Notez que les fonctions internes statiques (pas à portée de fichier) sont encore plus étroitement délimitées: si deux fonctions déclarent static int bleh = 0;
même dans le même fichier, elles ne sont pas liées. (*): Pour ceux qui ne vous sont pas familiers: dans le modèle habituel, une unité de compilation doit définir une variable globale, et d'autres peuvent la référencer. Il «vit» dans cette unité de compilation. Dans le cas (3) ci-dessus, aucun fichier (ou tous les fichiers) ne le définit. Si deux fichiers indiquent int blah = 0;
, l'éditeur de liens se plaindra de plusieurs définitions. Si deux fichiers disent int blah;
l'éditeur de liens crée gaiement un seul int
global et provoque tout le code s'y référer.
qu'appelle-t-on alors (dans la portée du fichier), en termes de spécificateurs de stockage? –
@bmargulies: Au niveau de la portée du fichier, vous voulez dire? Parce qu'à la portée de la fonction, une variable statique est celle qui conserve sa valeur après le retour des fonctions, et à la portée de la classe, un membre statique a une seule instance disponible pour tous les objets. – mingos
Clarifié par l'édition, je confiance. – bmargulies