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 non
const
globale specificaextern
che la variabile o la funzione è definita in un'altra unità di conversione. Deveextern
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. Deveextern
essere applicato a tutte le dichiarazioni in tutti i file. Le variabili globaliconst
hanno un collegamento interno per impostazione predefinita.extern "C"
specifica che la funzione è definita altrove e usa la convenzione di chiamata del linguaggio C. Ilextern "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 diextern
, 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 extern
constexpr
, 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
Commenti e suggerimenti
https://aka.ms/ContentUserFeedback.
Presto disponibile: Nel corso del 2024 verranno gradualmente disattivati i problemi di GitHub come meccanismo di feedback per il contenuto e ciò verrà sostituito con un nuovo sistema di feedback. Per altre informazioni, vedereInvia e visualizza il feedback per