extern
(C++)
Klíčové extern
slovo lze použít na globální proměnnou, funkci nebo deklaraci šablony. Určuje, že symbol má externí propojení. 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á externí propojení. 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íextern
naleznete 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 ve výchozím nastavení externí. 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 externí propojení, použijte extern
klíčové slovo pro definici a u všech ostatních deklarací v jiný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 extern
constexpr
promě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