Quelle est la différence entre le mot clé statique dans C et C?
Réponses
Trop de publicités?L' static
mot-clé sert aux mêmes fins en C et C++.
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++.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.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.
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.