Quelle est la différence entre le mot clé static en C et C++?
Le mot clé static
a les mêmes objectifs en C et C++.
Lorsqu'il est utilisé au niveau du fichier (en dehors d'une fonction), il définit la visibilité de l'élément auquel il est appliqué. Les éléments statiques ne sont pas visibles en dehors de leur unité de compilation (par exemple, pour l'éditeur de liens). Leur durée est la même que la durée du programme.
Ces éléments de niveau fichier (fonctions et données) doivent être statiques sauf s’il est spécifiquement nécessaire d’y accéder de l’extérieur (et il n’est presque jamais nécessaire de donner un accès direct aux données car cela enfreint le principe central de l’encapsulation).
Si (comme votre commentaire à la question l'indique), c'est la seule utilisation de static
qui vous intéresse, alors non, il n'y a pas de différence entre C et C++.
Lorsqu'il est utilisé dans une fonction, il définit la durée de l'élément. Encore une fois, la durée est la même que celle du programme et l'élément continue d'exister entre les invocations de cette fonction.
Cela n’affecte pas la visibilité de cet élément car il est visible uniquement dans la fonction. Un exemple est un générateur de nombres aléatoires qui doit conserver sa valeur de départ entre les invocations mais ne veut pas que cette valeur soit visible par les autres fonctions.
C++ a encore une utilisation, static
au sein d'une classe. Lorsqu'il est utilisé ici, il devient une seule variable de classe commune à tous les objets de cette classe. Un exemple classique consiste à stocker le nombre d'objets instanciés pour une classe donnée.
Comme d'autres l'ont fait remarquer, l'utilisation de static au niveau fichier a été déconseillée au profit d'espaces de noms non nommés. Cependant, je crois que la journée sera froide dans un certain lieu chaud avant que la langue ne soit supprimée - il y a trop de code qui l'utilise pour le moment. Et ISO C n’a que vient de supprimer gets()
malgré le temps que nous avons tous su qu’il s’agissait d’une fonction dangereuse.
Et même si elle est déconseillée, cela ne change pas sa sémantique maintenant.
L'utilisation de static au niveau du fichier pour limiter l'accès à l'unité de traduction en cours est obsolète en C++, mais reste acceptable en C.
Au lieu de cela, utilisez un espace de nom non nommé
namespace
{
int file_scope_x;
}
Les variables déclarées de cette manière ne sont disponibles que dans le fichier, comme si elles avaient été déclarées statiques.
La raison principale de la dépréciation est de supprimer l'une des nombreuses significations surchargées du mot clé static.
A l'origine, cela signifiait que la variable, telle que dans une fonction, serait stockée pendant la durée de vie du programme dans une zone pour de telles variables et non stockée sur la pile, comme c'est le cas pour les variables locales de fonction.
Ensuite, le mot clé a été surchargé pour être appliqué au couplage de la portée du fichier. Il n'est pas souhaitable de créer de nouveaux mots clés si nécessaire, car ils risqueraient de casser le code existant. Donc, celui-ci a été utilisé à nouveau avec une signification différente sans provoquer de conflits, car une variable déclarée comme statique ne peut pas être à la fois dans une fonction et au niveau supérieur, et les fonctions n'avaient pas le modificateur auparavant. (La connotation de stockage est totalement perdue lorsque vous vous référez à des fonctions, car elles ne sont stockées nulle part.)
Lorsque des classes sont apparues en C++ (et en Java et C #), le mot clé a été utilisé une nouvelle fois, mais la signification est au moins plus proche de l'intention initiale. Les variables déclarées de cette manière sont stockées dans une zone globale, par opposition à la pile comme pour les variables de fonction, ou sur le tas comme pour les membres d'objet. Comme les variables ne peuvent pas être à la fois au niveau supérieur et à l'intérieur d'une définition de classe, une signification supplémentaire peut être attachée sans ambiguïté aux variables de classe. Ils ne peuvent être référencés que via le nom de la classe ou depuis un objet de cette classe.
Cela a la même signification dans les deux langues.
Mais C++ ajoute des classes. Dans le contexte d'une classe (et donc d'une structure), cela a aussi le sens de rendre les membres de la méthode/méthode variables plutôt que les membres de l'objet.
class Plop
{
static int x; // This is a member of the class not an instance.
public:
static int getX() // method is a member of the class.
{
return x;
}
};
int Plop::x = 5;
Notez que l'utilisation du terme statique pour signifier "portée du fichier" (c'est-à-dire portée de l'espace de nom) est uniquement déconseillée par la norme C++ pour les objets, pas pour les fonctions. En d'autres termes,:
// foo.cpp
static int x = 0; // deprecated
static int f() { return 1; } // not deprecated
Pour citer l'annexe D de la norme:
L'utilisation du mot clé static est obsolète lors de la déclaration d'objets dans portée de l'espace de noms.
Vous ne pouvez pas déclarer une variable statique à l'intérieur de la structure en C ... Mais autorisée en Cpp à l'aide de l'opérateur de résolution d'étendue.
De plus, dans Cpp, la fonction statique ne peut accéder qu'aux variables statiques, mais en C, la fonction statique peut avoir des variables statiques et non statiques ... ????