web-dev-qa-db-fra.com

Quand utiliser extern en C ++

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

extern int x;
extern float y;

Je pense en 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?

358
Aslan986

Cela s'avère utile lorsque vous avez des variables globales. Vous déclarez le existence des variables globales dans un en-tête, de sorte que chaque fichier source incluant l'en-tête le sache, mais vous devez simplement le "définir" une fois dans l'un de vos fichiers source.

Pour clarifier, utiliser 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 simplement besoin de connaître le type et le nom pour savoir comment l'utiliser. Une fois que tous les fichiers source ont été compilés, l’éditeur de liens résout 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 "liaison externe", ce qui signifie 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.

entê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;
}
464
dreamlax

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

Par exemple:

dans file1.cpp:

int global_int = 1;

dans file2.cpp:

extern int global_int;
//in some function
cout << "global_int = " << global_int;
140
MByD

Il s’agit du lien .

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

Mais je veux ajouter un point important.

Vous posez des questions sur extern dans C++ pas dans C et je ne sais pas pourquoi il n’ya pas de réponse mentionnant le cas où extern est livré avec const en C++.

En C++, une variable const a un lien interne par défaut (contrairement à C).

Donc, ce scénario conduira à erreur de liaison :

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

Ce doit être comme ça:

Source 1:

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

Source 2:

extern const int global; //declaration
57
Trevor

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

13
Marlon

Lorsque vous avez des variables globales, vous devez les déclarer externes dans toute unité de traduction dans laquelle elles ne sont pas définies ou vous obtiendrez plusieurs définitions. Ceci doit évidemment être évité car les globals 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 est nul, tu n’aurais pas besoin de ça non plus.

Enfin, vous déclarez une instanciation de modèle qui se produit ailleurs et vous souhaitez y créer un lien plutôt que d'en créer une nouvelle. Vous déclarez ces externes aussi. Cela a une utilisation occasionnelle ... peut-être ... je ne l'ai jamais fait.

Je pense pouvoir compter le nombre de fois où j'ai eu besoin de "extern" en C++, car j'ai tendance à éviter tous les constructs dans lesquels cela est nécessaire.

0
Edward Strange