Quand utiliser extern en C++

Je lis "penser en C++" et il vient d'introduire la déclaration extern. Par exemple:

extern int x;
extern float y;

Je pense comprendre le sens (déclaration sans définition), mais je me demande quand cela s'avère utile.

Quelqu'un peut-il donner un exemple?

281
demandé sur sdgfsdh 2012-05-03 01:31:27

5 réponses

Cela est utile lorsque vous avez des variables globales. Vous déclarez l'existence de variables globales dans un en-tête, de sorte que chaque fichier source qui inclut l'en-tête le sache, mais vous n'avez besoin de le "définir" qu'une seule fois dans l'un de vos fichiers source.

À préciser, à l'aide de extern int x; indique au compilateur qu'un objet de type int appelé x existe quelque part. Ce n'est pas le travail des compilateurs de savoir où il existe, il a juste besoin de connaître le type et le nom pour savoir comment utiliser. Une fois que tous les fichiers source ont été compilés, l'éditeur de liens résoudra toutes les références de x à la définition qu'il trouve dans l'un des fichiers source compilés. Pour que cela fonctionne, la définition de la variable x doit avoir ce qu'on appelle "lien externe", ce qui signifie essentiellement qu'elle doit être déclarée en dehors d'une fonction (à ce qu'on appelle habituellement "la portée du fichier") et sans le mot-clé static.

En-tête:

#ifndef HEADER_H
#define HEADER_H

// any source file that includes this will be able to use "global_x"
extern int global_x;

void print_global_x();

#endif

Source 1:

#include "header.h"

// it needs to be defined somewhere
int global_x;

int main()
{
    //set global_x here:
    global_x = 5;

    print_global_x();
}

Source 2:

#include <iostream>
#include "header.h"

void print_global_x()
{
    //print global_x here:
    std::cout << global_x << std::endl;
}
387
répondu dreamlax 2015-03-17 21:24:59

C'est utile lorsque vous partagez une variable entre quelques modules. Vous le définissez dans un module, et utilisez extern dans les autres.

Par exemple:

Dans le fichier1.rpc:

int global_int = 1;

Dans le fichier2.rpc:

extern int global_int;
//in some function
cout << "global_int = " << global_int;
114
répondu MByD 2012-05-02 21:32:44

Tout tourne autour du lien .

Les réponses précédentes ont fourni de bonnes explications sur extern.

Mais je veux ajouter un point important.

Vous posez des questions sur externdans C++pas dans C et je ne sais pas pourquoi il n'y a pas de réponse mentionnant le cas où extern vient avec const en C++.

En C++, une variable const a une liaison interne par défaut (pas comme C).

Donc ce scénario conduira à liaison erreur:

Source 1 :

const int global = 255; //wrong way to make a definition of global const variable in C++

Source 2 :

extern const int global; //declaration

Il doit être comme ceci:

Source 1 :

extern const int global = 255; //a definition of global const variable in C++

Source 2 :

extern const int global; //declaration
39
répondu Nik 2018-01-09 09:17:06

Ceci est utile lorsque vous voulez avoir une variable globale. Vous définissez les variables globales dans un fichier source et les déclarez extern dans un fichier d'en-tête afin que tout fichier qui inclut ce fichier d'en-tête voit alors la même variable globale.

11
répondu Marlon 2012-05-02 21:33:37

Lorsque vous avez des variables globales, vous devez les déclarer externes dans n'importe quelle unité de traduction dans laquelle elles ne sont pas définies ou vous obtiendrez plusieurs définitions. Ceci est bien sûr à éviter puisque les globaux ne sont généralement pas bons.

Lorsque vous écrivez en C et que vous souhaitez autoriser les utilisateurs c++ à utiliser votre bibliothèque, vous déclarez vos éléments dans un bloc extern "C" {}. Puisque C suce, vous ne devriez pas en avoir besoin non plus.

Et puis il y a des modèles externes, qui ne font pas partie de la norme plus.

Enfin, il y a la déclaration d'une instanciation de modèle qui se produit ailleurs et que vous voulez lier plutôt que d'en faire un nouveau. Vous déclarez ces externes aussi. Cela a une utilisation occasionnelle...peut-être...Je n'ai jamais.

Je pense que je peux compter le nombre de fois où j'ai besoin de "extern" en C++ d'une part puisque j'ai tendance à éviter toutes les constructions dans lesquelles il est nécessaire.

-2
répondu Crazy Eddie 2012-05-02 21:35:58