52 votes

Différence entre statique en C et statique en C?

Quelle est la différence entre le mot clé statique dans C et C?

84voto

paxdiablo Points 341644

L' static mot-clé sert aux mêmes fins en C et C++.

  1. Lorsqu'il est utilisé à niveau du fichier (en dehors d'une fonction), il définit la visibilité de l'objet auquel il est appliqué. Des éléments statiques ne sont pas visibles à l'extérieur de leur unité de compilation (par exemple, à l'éditeur de liens). Leur durée est la même que la durée du programme.

    Ces fichier des éléments de niveau (fonctions et données) doit être statique, sauf si il y a un besoin spécifique pour y accéder depuis l'extérieur (et il y a toujours jamais un besoin de donner accès à des données depuis qui rompt le principe central de l'encapsulation).

    Si (comme votre commentaire à la question indique) c'est la seule utilisation de l' static qui vous intéresse puis, non, il n'y a pas de différence entre le C et le C++.

  2. Lorsqu'il est utilisé dans une fonction, il fixe la durée de l'élément. Encore une fois, la durée est la même que le programme et l'objet continue d'exister entre les appels de cette fonction.

    Il n'a pas d'incidence sur la visibilité de cet élément car il est visible que dans la fonction. Un exemple est un générateur de nombre aléatoire qui a besoin de garder sa valeur de départ entre les appels, mais ne veut pas que la valeur visibles à d'autres fonctions.

  3. C++ a une autre utilité, static au sein d'une classe. Quand y sont utilisés, il devient une seule variable de classe communes à tous les objets de cette classe. Un exemple classique est pour stocker le nombre d'objets qui ont été instancié pour une classe donnée.

Comme d'autres l'ont souligné, l'utilisation de fichier de niveau statique a été dépréciée en faveur des sans nom espace de noms. Cependant, je crois qu'il va être un jour de froid dans un certain endroit chaud avant qu'il est réellement retiré de la langue - il y a juste trop de code à l'aide en ce moment. Et C ISO ont seulement juste eu le temps de dépose gets() , malgré la quantité de temps que nous avons tous connu, il était dangereux de fonction.

Et même si c'est déconseillé, cela ne change pas sa sémantique maintenant.

14voto

UncleO Points 4675

L'utilisation de la statique à la portée du fichier à restreindre l'accès à l'actuelle unité de traduction est déconseillée en C++, mais encore acceptable en C.

Au lieu de cela, utilisez un sans nom d'espace de noms

namespace
{
    int file_scope_x;
}

Les Variables déclarées de cette façon ne sont disponibles que dans le fichier, comme si elles ont été déclarées static.

La principale raison de la dépréciation est de supprimer l'un des plusieurs surchargé de significations du mot-clé static.

A l'origine, il signifiait que la variable, comme dans une fonction, serait de stockage donné pour la durée de vie du programme dans une zone pour de telles variables, et ne sont pas stockées sur la pile comme il est habituel pour fonction de variables locales.

Puis le mot a été surchargé s'appliquent à la portée du fichier de liaison. Il n'est pas souhaitable de mettre en place de nouveaux mots-clés comme nécessaire, car ils sont susceptibles de casser le code existant. Si celui-ci a été de nouveau utilisé avec un sens différent sans provoquer des conflits, car une variable déclarée comme statique ne peut pas être à la fois à l'intérieur d'une fonction et au plus haut niveau, et les fonctions n'ont pas le modificateur avant. (Le stockage connotation est totalement perdue lorsque l'on se réfère à certaines fonctions, comme ils ne sont pas stockées n'importe où).

Lorsque les classes est venu en C++ et en Java et C#) le mot-clé a été utilisé de nouveau, mais le sens est au moins plus proche de l'intention d'origine. Les Variables déclarées de cette façon sont stockés dans une zone globale, par opposition à sur la pile comme pour la fonction de variables, ou sur le tas comme pour les membres de l'objet. Parce que les variables ne peuvent pas être à la fois au plus haut niveau et à l'intérieur d'une définition de classe, un sens supplémentaire peut être clairement rattachés à des variables de classe. Ils ne peuvent être référencé par le nom de la classe ou de l'intérieur d'un objet de cette classe.

9voto

Loki Astari Points 116129

Il a la même signification dans les deux langues.

Mais le CMD ajoute des classes. Dans le contexte d'une classe (et donc d'une structure), il a le sens supplémentaire de faire de la méthode / membres de classe variable plutôt des membres de l'objet.

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