Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
A extern kulcsszó alkalmazható globális változóra, függvényre vagy sablondeklarációra. Meghatározza, hogy a szimbólum külső kapcsolatokkal rendelkezik-e. A csatolással és a globális változók használatának visszaszorításával kapcsolatos háttérinformációkért tekintse meg a fordítási egységeket és a csatolást.
A extern kulcsszónak a kontextustól függően négy jelentése van:
A nem
constglobális változók deklarációjában azt adja meg,externhogy a változó vagy függvény egy másik fordítási egységben van definiálva. Eztexternminden fájlban alkalmazni kell, kivéve azt, amelyikben a változó definiálva van.constA változó deklarációjában azt határozza meg, hogy a változó külső kapcsolatokkal rendelkezik. Azexternösszes fájlban lévő összes deklarációra alkalmazni kell. (A globálisconstváltozók alapértelmezés szerint belső kapcsolattal rendelkeznek.)extern "C"azt határozza meg, hogy a függvény máshol van definiálva, és a C nyelvű hívási konvenciót használja. Aextern "C"módosító egy blokk több függvénydeklarációja esetén is alkalmazható.Egy sablondeklarációban azt adja meg,
externhogy a sablon már máshol lett példányosítva.externazt jelzi a fordítónak, hogy újra felhasználhatja a másik példányt, ahelyett, hogy újat hoz létre az aktuális helyen. A használatrólexterntovábbi információt az Explicit példányosítás című témakörben talál.
extern összekapcsolás nemconst globálisak számára
Amikor a hivatkozás egy globális változó deklarációja extern előtt jelenik meg, egy másik fordítási egységben keresi a definíciót. A globális hatókörben lévő nemconst változók deklarációi alapértelmezés szerint külsőek. Csak azokra a deklarációkra vonatkozik extern , amelyek nem adják meg a definíciót.
//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)
externglobális kapcsolatok const
Egy const globális változó alapértelmezés szerint belső kapcsolattal rendelkezik. Ha azt szeretné, hogy a változó külső kapcsolaton alapuljon, alkalmazza a extern kulcsszót a definícióra és a többi fájlban lévő összes többi deklarációra:
//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 Kapcsolat
A Visual Studio 2017 15.3-s és korábbi verziójában a fordító mindig adott egy constexpr változó belső kapcsolatát, még akkor is, ha a változót megjelölték extern. A Visual Studio 2017 15.5-ös és újabb verzióiban a /Zc:externConstexpr fordítókapcsoló megfelelő szabványmegfelelő viselkedést tesz lehetővé. Végül a beállítás lesz az alapértelmezett. A /permissive- beállítás nem engedélyezve /Zc:externConstexprvan.
extern constexpr int x = 10; //error LNK2005: "int const x" already defined
Ha egy fejlécfájl deklarált változót externconstexprtartalmaz, akkor meg kell jelölni __declspec(selectany) , hogy helyesen legyenek kombinálva a duplikált deklarációk:
extern constexpr __declspec(selectany) int x = 10;
extern "C" és extern "C++" függvénydeklarációk
A C++-ban sztring használata esetén azt határozza meg, extern hogy a deklarátor(ok) számára egy másik nyelv kapcsolati konvenciói legyenek használatban. A C függvények és adatok csak akkor érhetők el, ha korábban C-kapcsolatként deklarálták őket. Ezeket azonban külön lefordított fordítási egységben kell meghatározni.
A Microsoft C++ támogatja a sztringeket és "C++" a sztringkonstans"C" mezőt. Az összes standard belefoglalási fájl a szintaxist használja, extern "C" hogy a futásidejű kódtárfüggvények használhatók legyenek a C++ programokban.
példa
Az alábbi példa bemutatja, hogyan deklarálhatja a C kapcsolatú neveket:
// 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;
Ha egy függvény több kapcsolati specifikációval rendelkezik, meg kell egyeznie. Hiba a függvények C és C++ kapcsolatúként való deklarálása. Továbbá, ha egy függvény két deklarációja történik egy programban, egy kapcsolati specifikációval és egy anélkül, akkor a csatolási specifikációval rendelkező deklarációnak kell elsőnek lennie. Minden olyan redundáns deklaráció, amely már rendelkezik kapcsolati specifikációval, az első deklarációban megadott csatolást kapja. Például:
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 Visual Studio 2019-től kezdve, ha /permissive- meg van adva, a fordító ellenőrzi, hogy a függvényparaméterek deklarációi extern "C" is egyeznek-e. A deklarált extern "C"függvények nem terhelhetők túl. A Visual Studio 2019 16.3-s verziójától kezdve ezt az ellenőrzést felülbírálhatja a beállítás után /permissive- a /Zc:externC- fordítóval.
Lásd még
Kulcsszavak
Fordítási egységek és csatolás
extern Storage-Class Kijelölő a C-ben
Az azonosítók viselkedése a C-ben
Összekapcsolás a C-ben