extern (C++)

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 nemconst globális változók deklarációjában azt adja meg, extern hogy a változó vagy függvény egy másik fordítási egységben van definiálva. Ezt extern minden fájlban alkalmazni kell, kivéve azt, amelyikben a változó definiálva van.

  • const A változó deklarációjában azt határozza meg, hogy a változó külső kapcsolatokkal rendelkezik. Az extern összes fájlban lévő összes deklarációra alkalmazni kell. (A globális const vá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. A extern "C" módosító egy blokk több függvénydeklarációja esetén is alkalmazható.

  • Egy sablondeklarációban azt adja meg, extern hogy a sablon már máshol lett példányosítva. extern azt 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ól externtová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