/ / Les variables globales sont-elles extern par défaut ou cela équivaut-il à déclarer une variable avec extern en global? - c ++, c, statique, global, externe

Les variables globales sont-elles extern par défaut ou cela équivaut-il à déclarer une variable avec extern en global? - c ++, c, statique, global, externe

J'ai traversé deux questions suivantes,

variables globales statiques et externes en C et C ++

variable globale en C sont statiques ou non?

Les deux questions disent les deux choses de manière différente.

Question 1 "s Réponse: Global variables are not extern nor static by default on C and C++.

Question 2 "s Réponse: If you do not specify a storage class (that is, the extern or static keywords), then by default global variables have external linkage

J'ai besoin de savoir ce qui suit.

  1. est-ce que les variables globales sont extern par défaut dans linkage (ou) cela équivaut à déclarer une variable en spécifiant une classe de stockage externe?

Les variables globales 2.is sont statiques par défaut dans la portée (ou) cela équivaut à déclarer une variable en spécifiant une classe de stockage statique?

3. S'il y a une différence entre c ou c ++, veuillez clarifier?

Réponses:

7 pour la réponse № 1

est les variables globales sont extern par défaut dans linkage (ou), cela équivaut à déclarer une variable en spécifiant extern classe de stockage?

La durée de stockage par défaut, la portée et le couplage des variables déclarées en dehors de tout bloc, au niveau le plus externe, ont static durée de stockage, fichier portée et external lien. La norme C11 dit que:

6.2.1 Portée des identifiants (p4):

[...] Si le déclarateur ou le spécificateur de type qui déclare l'identificateur apparaît en dehors de tout bloc ou liste de paramètres, l'identifiant a portée du fichier, qui se termine à la fin de l’unité de traduction. [...]

6.2.2 Liens des identifiants (p5):

[...] Si la déclaration d'un identifiant pour un objet a une portée de fichier et aucun spécificateur de classe de stockage, son lien est external.

6.2.4 Durée de stockage des objets (p3):

Un objet dont l'identifiant est déclaré sans le spécificateur de classe de stockage _Thread_localet soit avec externe ou interne liaison ou avec le spécificateur de classe de stockage static, a durée de stockage statique.

Donc si x est global

int x;

alors, sa durée de stockage, sa portée et son couplage équivalent à x dans

extern int x;

est les variables globales sont static par défaut dans la portée (ou), cela équivaut à déclarer une variable en spécifiant static classe de stockage?

Comme je l’ai dit plus haut, sa durée est de static et il a fichier portée.

S'il y a une différence entre c ou c ++, veuillez clarifier?

Aucune différence. La règle est la même dans les deux langues.


3 pour la réponse № 2

est-ce que les variables globales sont extern par défaut dans linkage (ou) cela équivaut à déclarer une variable en spécifiant une classe de stockage externe?

Sauf indication contraire, ils ont une liaison externe (sauf en C ++, où ils ont une liaison interne s'ils sont constants).

La première réponse à laquelle vous associez dit que cela n’équivaut pas à le déclarer. extern (ce qui en fait une déclaration pure, pas une définition); non pas qu’il n’ait pas de lien externe.

les variables globales sont-elles statiques par défaut dans la portée (ou) cela équivaut-il à déclarer une variable en spécifiant une classe de stockage statique?

En C ++, ils ont un lien interne (comme s'ils étaient déclarés static) s’ils sont constants, lien externe sinon. En C, ils ont toujours un lien externe.

S'il y a une différence entre c ou c ++, veuillez clarifier?

Comme mentionné ci-dessus, la liaison par défaut est toujours une liaison externe en C, tandis qu’en C ++, elle est interne pour les variables constantes.