extern (C++)

Klíčové extern slovo lze použít na globální proměnnou, funkci nebo deklaraci šablony. Určuje, že symbol má externpropojení. Základní informace o propojení a důvodech, proč se používání globálních proměnných nedoporučuje, najdete v tématu Jednotky překladu a propojení.

Klíčové extern slovo má čtyři významy v závislosti na kontextu:

  • V deklaraci jiné nežconst globální proměnné určuje, extern že proměnná nebo funkce je definována v jiné jednotce překladu. Musí extern se použít ve všech souborech s výjimkou souboru, ve kterém je proměnná definována.

  • const V deklaraci proměnné určuje, že proměnná má externpropojení. Musí extern se použít u všech deklarací ve všech souborech. (Globální const proměnné mají ve výchozím nastavení interní propojení.)

  • extern "C" určuje, že funkce je definována jinde a používá konvenci volání jazyka C. extern "C" Modifikátor lze použít také u více deklarací funkce v bloku.

  • V deklaraci šablony určuje, extern že šablona již byla vytvořena na jiném místě. extern říká kompilátoru, že může znovu použít jinou instanci, a ne vytvořit novou instanci v aktuálním umístění. Další informace o tomto použití externnaleznete v tématu Explicitní vytvoření instance.

extern propojení pro jiné nežconst globální

Když linker uvidí extern před deklaraci globální proměnné, vyhledá definici v jiné jednotce překladu. Deklarace neconst proměnných v globálním oboru jsou externve výchozím nastavení všechny. Platí extern pouze pro deklarace, které neposkytují definici.

//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 propojení pro const globální organizace

Globální proměnná const má ve výchozím nastavení interní propojení. Pokud chcete, aby proměnná měla external linkage, použijte extern klíčové slovo pro definici a u všech ostatních deklarací v ostatních souborech:

//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 Propojení

V sadě Visual Studio 2017 verze 15.3 a starší kompilátor vždy poskytl proměnnou constexpr interní propojení, i když byla proměnná označena extern. V sadě Visual Studio 2017 verze 15.5 a novějších /Zc:externConstexpr umožňuje přepínač kompilátoru správné chování odpovídající standardům. Nakonec se tato možnost stane výchozí. Tato /permissive- možnost nepovoluje /Zc:externConstexpr.

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

Pokud soubor hlavičky obsahuje deklarovanou externconstexprproměnnou, musí být označen __declspec(selectany) , aby se správně zkombinovaly jeho duplicitní deklarace:

extern constexpr __declspec(selectany) int x = 10;

extern "C" deklarací funkcí a extern "C++" funkcí

Při použití s řetězcem v jazyce C++ určuje, extern že se pro deklarátory používají konvence propojení jiného jazyka. K funkcím a datům jazyka C je možné přistupovat pouze v případě, že jsou dříve deklarovány jako propojení jazyka C. Musí však být definovány v odděleně kompilované jednotce překladu.

Microsoft C++ podporuje řetězce "C" a v poli řetězcového literálu."C++" Všechny standardní soubory zahrnutí používají extern "C" syntaxi, aby bylo možné používat funkce knihovny runtime v programech C++.

Příklad

Následující příklad ukazuje, jak deklarovat názvy, které mají propojení jazyka 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;

Pokud má funkce více než jednu specifikaci propojení, musí souhlasit. Deklarování funkcí jako propojení C i C++ je chybou. Kromě toho platí, že pokud v programu dojde ke dvěma deklaracím pro funkci, jedna se specifikací propojení a jedna bez deklarace se specifikací propojení musí být první. Jakékoli nadbytečné deklarace funkcí, které již specifikaci propojení obsahují, obdrží propojení zadané v první deklaraci. Příklad:

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.

Počínaje sadou Visual Studio 2019 kompilátor zkontroluje, /permissive- že extern "C" deklarace parametrů funkce se také shodují. Nelze přetížit funkci deklarovanou jako extern "C". Od sady Visual Studio 2019 verze 16.3 můžete tuto kontrolu přepsat pomocí možnosti kompilátoru /Zc:externC-/permissive- za touto možností.

Viz také

Klíčová slova
Jednotky překladu a propojení
extern Specifikátor třídy úložiště v jazyce C
Chování identifikátorů v jazyce C
Propojení v jazyce C