Condividi tramite


extern (C++)

La extern parola chiave può essere applicata a una variabile globale, a una funzione o a una dichiarazione di modello. Specifica che il simbolo ha external linkage. Per informazioni di base sul collegamento e sul motivo per cui l'uso di variabili globali è sconsigliato, vedere Unità di conversione e collegamento.

La extern parola chiave ha quattro significati a seconda del contesto:

  • In una dichiarazione di variabile nonconst globale specifica extern che la variabile o la funzione è definita in un'altra unità di conversione. Deve extern essere applicato in tutti i file, ad eccezione di quello in cui è definita la variabile.

  • In una const dichiarazione di variabile specifica che la variabile ha external linkage. Deve extern essere applicato a tutte le dichiarazioni in tutti i file. Le variabili globali const hanno un collegamento interno per impostazione predefinita.

  • extern "C" specifica che la funzione è definita altrove e usa la convenzione di chiamata del linguaggio C. Il extern "C" modificatore può anche essere applicato a più dichiarazioni di funzione in un blocco.

  • In una dichiarazione di modello specifica extern che il modello è già stato creato un'istanza altrove. extern indica al compilatore che può riutilizzare l'altra istanza, anziché crearne una nuova nella posizione corrente. Per altre informazioni su questo uso di extern, vedere Creazione di istanze esplicite.

extern linkage for non-const globals

Quando il linker vede extern prima di una dichiarazione di variabile globale, cerca la definizione in un'altra unità di conversione. Per impostazione predefinita, le dichiarazioni di variabili nonconst variabili nell'ambito globale sono external. Si applicano extern solo alle dichiarazioni che non forniscono la definizione.

//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 linkage for const globals

Per impostazione predefinita, una const variabile globale ha un collegamento interno. Se si vuole che la variabile abbia external linkage, applicare la extern parola chiave alla definizione e a tutte le altre dichiarazioni in altri file:

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

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

extern constexpr Collegamento

In Visual Studio 2017 versione 15.3 e precedenti il compilatore ha sempre assegnato un constexpr collegamento interno variabile, anche quando la variabile è stata contrassegnata come extern. In Visual Studio 2017 versione 15.5 e successive, l'opzione del /Zc:externConstexpr compilatore abilita il comportamento corretto conforme agli standard. Alla fine l'opzione diventerà l'impostazione predefinita. L'opzione /permissive- non abilita /Zc:externConstexpr.

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

Se un file di intestazione contiene una variabile dichiarata externconstexpr, deve essere contrassegnata __declspec(selectany) per avere correttamente le dichiarazioni duplicate combinate:

extern constexpr __declspec(selectany) int x = 10;

extern "C"dichiarazioni di funzioni e extern "C++"

In C++, se usato con una stringa, extern specifica che le convenzioni di collegamento di un altro linguaggio vengono usate per i dichiaratori. È possibile accedere alle funzioni e ai dati C solo se sono dichiarati in precedenza come c linkage. Tuttavia, devono essere definiti in una unità di conversione compilata separatamente.

Microsoft C++ supporta le stringhe "C" e "C++" nel campo stringa-letterale . Tutti i file di inclusione standard usano la extern "C" sintassi per consentire l'uso delle funzioni della libreria di runtime nei programmi C++.

Esempio

Nell'esempio seguente viene illustrato come dichiarare i nomi con collegamento 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;

Se una funzione ha più di una specifica di collegamento, deve accettare. Si tratta di un errore per dichiarare le funzioni con collegamento sia C che C++. Inoltre, se due dichiarazioni per una funzione si verificano in un programma, una con una specifica di collegamento e una senza, la dichiarazione con la specifica di collegamento deve essere prima. A tutte le dichiarazioni ridondanti di funzioni che hanno già specifiche di collegamento viene fornito il collegamento specificato nella prima dichiarazione. Ad esempio:

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.

A partire da Visual Studio 2019, quando /permissive- viene specificato, il compilatore verifica che le dichiarazioni dei parametri di extern "C" funzione corrispondano anche. Non è possibile eseguire l'overload di una funzione dichiarata come extern "C". A partire da Visual Studio 2019 versione 16.3, è possibile eseguire l'override di questo controllo usando l'opzione del /Zc:externC- compilatore dopo l'opzione /permissive- .

Vedi anche

Parole chiave
Unità di traduzione e collegamento
externIdentificatore di classe Archiviazione in C
Comportamento degli identificatori in C
Collegamento in C