extern (C++)

La extern mot clé peut être appliquée à une variable globale, une fonction ou une déclaration de modèle. Il spécifie que le symbole a externune liaison al. Pour obtenir des informations générales sur la liaison et la raison pour laquelle l’utilisation de variables globales est déconseillée, consultez unités de traduction et liaison.

Le extern mot clé a quatre significations en fonction du contexte :

  • Dans une déclaration de variable nonconst globale, extern spécifie que la variable ou la fonction est définie dans une autre unité de traduction. Le extern fichier doit être appliqué dans tous les fichiers, à l’exception de celui où la variable est définie.

  • Dans une const déclaration de variable, elle spécifie que la variable a externune liaison al. La extern valeur doit être appliquée à toutes les déclarations de tous les fichiers. (Les variables globales const ont une liaison interne par défaut.)

  • extern "C" spécifie que la fonction est définie ailleurs et utilise la convention d’appel en langage C. Le extern "C" modificateur peut également être appliqué à plusieurs déclarations de fonction dans un bloc.

  • Dans une déclaration de modèle, extern spécifie que le modèle a déjà été instancié ailleurs. extern indique au compilateur qu’il peut réutiliser l’autre instanciation, plutôt que de en créer un à l’emplacement actuel. Pour plus d’informations sur cette utilisation extern, consultez instanciation explicite.

externliaison pour les non-globalsconst

Lorsque l’éditeur de liens voit extern avant une déclaration de variable globale, il recherche la définition dans une autre unité de traduction. Les déclarations de non-variablesconst au niveau de l’étendue globale sont external par défaut. S’applique extern uniquement aux déclarations qui ne fournissent pas la définition.

//fileA.cpp
int i = 42; // declaration and definition

//fileB.cpp
extern int i;  // declaration only. same as i in FileA

//fileC.cpp
extern int i;  // declaration only. same as i in FileA

//fileD.cpp
int i = 43; // LNK2005! 'i' already has a definition.
extern int i = 43; // same error (extern is ignored on definitions)

extern liaison pour const les globals

Par défaut, une const variable globale a une liaison interne. Si vous souhaitez que la variable ait externune liaison al, appliquez la extern mot clé à la définition et à toutes les autres déclarations dans d’autres fichiers :

//fileA.cpp
extern const int i = 42; // extern const definition

//fileB.cpp
extern const int i;  // declaration only. same as i in FileA

Liaison extern constexpr

Dans Visual Studio 2017 version 15.3 et antérieure, le compilateur a toujours donné une constexpr liaison interne de variable, même lorsque la variable a été marquée extern. Dans Visual Studio 2017 version 15.5 et ultérieure, le commutateur du /Zc:externConstexpr compilateur active un comportement conforme aux normes correct. Finalement, l’option devient la valeur par défaut. L’option /permissive- n’active /Zc:externConstexprpas .

extern constexpr int x = 10; //error LNK2005: "int const x" already defined

Si un fichier d’en-tête contient une variable déclarée externconstexpr, elle doit être marquée __declspec(selectany) pour que ses déclarations dupliquées soient combinées :

extern constexpr __declspec(selectany) int x = 10;

extern "C" et extern "C++" déclarations de fonction

En C++, lorsqu’elle est utilisée avec une chaîne, extern spécifie que les conventions de liaison d’un autre langage sont utilisées pour le ou les déclarateurs. Les fonctions C et les données sont accessibles uniquement si elles sont précédemment déclarées comme ayant une liaison C. Toutefois, elles doivent être définies dans une unité de traduction compilée séparément.

Microsoft C++ prend en charge les chaînes "C" et "C++" dans le champ littéral de chaîne. Tous les fichiers include standard utilisent la extern "C" syntaxe pour permettre aux fonctions de bibliothèque d’exécution d’être utilisées dans les programmes C++.

Exemple

L’exemple suivant montre comment déclarer des noms qui ont une liaison C :

// Declare printf with C linkage.
extern "C" int printf(const char *fmt, ...);

//  Cause everything in the specified
//  header files to have C linkage.
extern "C" {
    // add your #include statements here
#include <stdio.h>
}

//  Declare the two functions ShowChar
//  and GetChar with C linkage.
extern "C" {
    char ShowChar(char ch);
    char GetChar(void);
}

//  Define the two functions
//  ShowChar and GetChar with C linkage.
extern "C" char ShowChar(char ch) {
    putchar(ch);
    return ch;
}

extern "C" char GetChar(void) {
    char ch;
    ch = getchar();
    return ch;
}

// Declare a global variable, errno, with C linkage.
extern "C" int errno;

Si une fonction a plusieurs spécifications de liaison, elles doivent accepter. Il s’agit d’une erreur de déclarer des fonctions comme ayant à la fois une liaison C et C++. En outre, si deux déclarations pour une fonction se produisent dans un programme, une avec une spécification de liaison et une sans, la déclaration avec la spécification de liaison doit être d’abord. Toutes les déclarations redondantes de fonctions qui ont déjà une spécification de liaison sont affectées de la liaison spécifiée dans la première déclaration. Par exemple :

extern "C" int CFunc1();
...
int CFunc1();            // Redeclaration is benign; C linkage is
                         //  retained.

int CFunc2();
...
extern "C" int CFunc2(); // Error: not the first declaration of
                         //  CFunc2;  cannot contain linkage
                         //  specifier.

À compter de Visual Studio 2019, quand /permissive- il est spécifié, le compilateur case activée que les déclarations des paramètres de extern "C" fonction correspondent également. Vous ne pouvez pas surcharger une fonction déclarée en tant que extern "C". À compter de Visual Studio 2019 version 16.3, vous pouvez remplacer cette case activée à l’aide de l’option du /Zc:externC- compilateur après l’option/permissive-.

Voir aussi

Mots clés
Unités de traduction et liaison
externspécificateur de classe Stockage en C
Comportement des identificateurs en C
Liaison en C