7
votes

Comment fonctionne-t-il en C ++?

Ceci est à partir du : xxx

Il semble utiliser extern Les types de données définis dans d'autres espaces de noms seront juste être disponible?


0 commentaires

5 Réponses :


2
votes

Non, c'est un moyen explicite de dire CIN et Cout sont déclarés sans les définir réellement.


0 commentaires

9
votes

extern signifie "Ces variables sont définies dans une autre unité de compilation (fichier .cpp ou .lib)"

Dans ce cas, vous #include dans votre fichier .CPP et parce que CIN et cout sont déclarés comme externe , le compilateur vous permettra de les utiliser sans se plaindre. Ensuite, lorsque la liaison est exécutée, il lève tous les variables extern et trie tout le tout.


4 commentaires

Cela signifie-t-il Istream ou CIN est défini dans une autre unité dans le cas de extern iStream Cin; ?


Cela signifie Cin est. Ce n'est pas la même chose que la définition de la classe , laquelle dans ce cas est dans iostream . La définition Classe doit toujours être disponible dans une unité de compilation pour utiliser des objets de ce type de classe '(c'est pourquoi les définitions de classe sont placées dans les fichiers en-tête ).


CIN et COUT sont des variables globales. En C ++, une variable globale doit être déclarée sur un seul et un seul fichier .CPP (à quelques exceptions près). Donc, si vous venez de dire Istream Cin , la liaison se plaint lorsque vous allez lier deux fichiers qui déclarent tous deux la variable car il ne saurait pas savoir lequel utiliser. Donc, en déclarant tout sauf l'un d'entre eux comme extern , vous dites à la liaison d'utiliser le non- extern comme "réel", et le extern ceux qui disent simplement "Cette variable est déclarée dans un autre fichier .CPP".


La distinction entre déclarer et définir est essentielle pour comprendre cela. S'il vous plaît, procurez-vous bien! Ils ne sont pas synonymes.



7
votes

extern est utilisé pour désigner une variable définie dans une unité de compilation différente (pour l'instant, vous pouvez penser à une unité de compilation en tant que fichier .CPP). Les déclarations de votre exemple déclarent plutôt que définir CIN et cout . Il dit au compilateur que la définition de ces objets se trouve dans une autre unité de compilation (où elles sont non déclarées sous extern ).


5 commentaires

Mais je ne trouve nulle part où définir Cin , seul istream est défini dans


CIN est un objet de type Istream . ISTREAM est la classe (dans ce cas, la classe de modèle). CIN est une instance de la classe istream . La "définition" que je me réfère dans ma réponse est la définition de CIN , pas istream . Vous devez rechercher le sens de Définition vs. Déclaration . Les déclarations de vos exemples sont Déclarations .


La variable définition de la variable CIN est probablement dans une bibliothèque d'exécution. Vous ne le trouverez pas dans les fichiers d'en-tête de la bibliothèque standard.


@Stingraysc, y a-t-il un tour pour trouver où il est en fait défini?


@Symfony: Non. Il est défini dans le code qui a déjà été compilé dans une bibliothèque que vous associez votre code avec votre code. En général, une variable mentionnée par un externe peut être définie dans une unité de compilation mise à la disposition de la liaison (sous la forme d'un fichier d'objet compilé).



0
votes

Le mot clé extern indique au compilateur qu'une variable est déclarée dans une autre source (c'est-à-dire en dehors de la portée actuelle). La liaison trouve ensuite cette déclaration réelle et définit la variable extern pour pointer vers le bon emplacement.

Variables déclarées par Extern Les déclarations n'auront aucun espace alloué, car elles doivent être correctement définies ailleurs. Si une variable est déclarée externe et que la liaison ne trouve aucune déclaration réelle de celle-ci, elle montrera une erreur.

par exemple. extern int i;

// Cela déclare qu'il existe une variable nommée I de type INT, définie quelque part dans le programme.


0 commentaires

0
votes

Certaines réponses disent ici que l'extérieur signifie que la variable est définie dans une autre unité de compilation. Ensuite, il ne faut pas compiler car aucune autre unité de compilation ou fichier n'est fourni au compilateur.

extern int a;
int main(){
    std::cout<<a<<std::endl;    //Prints 3
}
int a=3;


0 commentaires