2010-08-19 27 views
9

Je sais que static est un mot-clé surchargé en C. Ici, je ne m'intéresse qu'à son utilisation en tant que mot-clé pour imposer le couplage interne.Liaison interne avec mot-clé statique en C

Si vous avez une variable globale déclarée dans un fichier .c, quelle est la différence entre utiliser static et ne pas utiliser static? De toute façon, aucun autre fichier .c n'a accès à la variable, donc la variable est fondamentalement "privée" dans le fichier, avec ou sans le mot-clé static.

Par exemple, si j'ai un fichier foo.c, et je déclare une variable globale:

int x = 5;

Cette variable x est uniquement disponible à code à l'intérieur foo.c (à moins bien sûr que je déclare dans une commune fichier d'en-tête avec le mot-clé extern). Mais si je ne le déclare pas dans un fichier d'en-tête, quelle serait la différence si je devais taper:

static int x = 5.

De toute façon, il semble que x a une liaison interne ici. Donc, je suis confus quant à l'objectif de static à cet égard.

+2

Vous avez presque répondu à votre propre question - vous avez dit "si je ne le déclare pas dans un fichier d'en-tête", ce qui signifie "si je n'écris pas une déclaration avec le mot clé extern". Le fait est qu'il est * impossible * d'écrire une telle déclaration si vous avez déclaré votre variable statique, alors que si ce n'est pas le cas, quelqu'un d'autre pourrait venir le faire, lier avec votre code et avoir accès à votre variable. (En plus de ce que mentionne Pascal Cuoq.) – Cascabel

+0

duplication possible de [Que signifie "statique" dans un programme C?] (Http://stackoverflow.com/questions/572547/what-does-static-mean-in- ac-programme). en particulier, j'aborde ce cas dans ma réponse: http://stackoverflow.com/a/14339047/895245 –

Répondre

10

Si vous avez une variable globale déclarée dans un fichier .c, quelle est la différence entre l'utilisation static et ne pas utiliser static? De toute façon, aucun autre fichier .c a accès à la variable [...]

Un autre fichier pourrait déclarerx:

extern int x; 

qui permettrait le code de référencement x de compiler, et le lieur serait alors heureusement relier ces références à tout x qu'il trouve. Empêche cela x d'être visible en dehors

+0

C'est intéressant. Cela ne semble-t-il pas une caractéristique très prémonitoire à une époque où l'encapsulation des données n'était pas largement pratiquée ou encouragée? – Channel72

+0

En d'autres termes, global permet à plusieurs déclarations à travers des fichiers de partager une seule définition en utilisant 'extern', ce qui n'est pas le cas de la statique. Droite? – naivnomore

+0

@ Channel72: Eh bien, c'est pourquoi les données globales sont mal vues: elles ne sont pas encapsulées. Si c'était le cas, il ne s'agirait pas de données _global_. – sbi

6

Il n'y a qu'un seul "espace de nommage", pour ainsi dire, en C. Sans le mot-clé "statique" vous n'êtes pas protégé d'un autre fichier utilisant le nom "x" (même si vous ne le rendez pas visible en-tête de la bibliothèque). Essayez de lier ensemble plusieurs fichiers C contenant une variable non-statique x (entrelacement des accès en lecture et en écriture des fonctions de chaque fichier), et comparez avec la situation où ces variables sont déclarées statiques.

+0

Bien sûr, si aucun de ces fichiers * initialise * le x global, vous pourriez obtenir un bloc commun ... .même si les types de vos différents «x» diffèrent. Merci à la nécessité de soutenir également FORTRAN dans l'éditeur de liens pour celui-là. – RBerteig

+0

@RBerteig Oui, sans initialisation était ce que je voulais dire. Le lecteur se demandant de quoi on parle peut visiter, par exemple, http://stackoverflow.com/questions/1490693/tentative-definitions-in-c99-and-linking –

+0

Tu dois juste aimer toutes ces petites choses obscures et ces coins et recoins ... – RBerteig