Dela via


extern (C++)

Nyckelordet extern kan tillämpas på en global variabel, funktion eller malldeklaration. Den anger att symbolen har extern länkning. Bakgrundsinformation om länkning och varför användningen av globala variabler inte rekommenderas finns i Översättningsenheter och länkning.

Nyckelordet extern har fyra betydelser beroende på kontexten:

  • I en icke-globalconst variabeldeklaration extern anger du att variabeln eller funktionen definieras i en annan översättningsenhet. extern Måste tillämpas i alla filer utom den där variabeln definieras.

  • I en const variabeldeklaration anger den att variabeln har extern länkning. extern Måste tillämpas på alla deklarationer i alla filer. (Globala const variabler har intern länkning som standard.)

  • extern "C" anger att funktionen definieras någon annanstans och använder C-språksamtalskonventionen. Modifieraren extern "C" kan också tillämpas på flera funktionsdeklarationer i ett block.

  • I en malldeklaration extern anger du att mallen redan har instansierats någon annanstans. extern talar om för kompilatorn att den kan återanvända den andra instansieringen i stället för att skapa en ny på den aktuella platsen. Mer information om den här användningen av externfinns i Explicit instansiering.

externlänkning för icke-globalconst

När länkaren ser extern före en global variabeldeklaration letar den efter definitionen i en annan översättningsenhet. Deklarationer av icke-variablerconst i globalt omfång är externa som standard. Gäller extern endast för de deklarationer som inte anger definitionen.

//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 länkning för const globaler

En const global variabel har intern länkning som standard. Om du vill att variabeln ska ha extern länkning tillämpar du nyckelordet extern på definitionen och på alla andra deklarationer i andra filer:

//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 Koppling

I Visual Studio 2017 version 15.3 och tidigare gav kompilatorn alltid en constexpr intern variabellänkning, även när variabeln var markerad extern. I Visual Studio 2017 version 15.5 och senare /Zc:externConstexpr möjliggör kompilatorväxeln rätt beteende som överensstämmer med standarder. Till slut blir alternativet standard. Alternativet /permissive- aktiverar /Zc:externConstexprinte .

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

Om en rubrikfil innehåller en deklarerad externconstexprvariabel måste den markeras __declspec(selectany) för att dess duplicerade deklarationer ska kombineras på rätt sätt:

extern constexpr __declspec(selectany) int x = 10;

extern "C" och extern "C++" funktionsdeklarationer

I C++, när det används med en sträng, extern anger att länkningskonventionerna för ett annat språk används för deklaratorerna. C-funktioner och -data kan endast nås om de tidigare har deklarerats ha C-länkning. De måste dock definieras i en separat kompilerad översättningsenhet.

Microsoft C++ stöder strängarna "C" och "C++" i strängliteralfältet . Alla standard inkluderar filer använder syntaxen extern "C" för att tillåta att körningsbiblioteksfunktionerna används i C++-program.

Exempel

I följande exempel visas hur du deklarerar namn som har C-länkning:

// 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;

Om en funktion har mer än en länkspecifikation måste de godkänna det. Det är ett fel att deklarera funktioner som att de har både C- och C++-länkning. Om två deklarationer för en funktion inträffar i ett program, en med en länkspecifikation och en utan, måste deklarationen med länkspecifikationen vara först. Alla redundanta deklarationer av funktioner som redan har länkningsspecifikation får den länkning som anges i den första deklarationen. Till exempel:

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.

Från och med Visual Studio 2019, när /permissive- anges, kontrollerar kompilatorn att deklarationerna av extern "C" funktionsparametrar också matchar. Du kan inte överbelasta en funktion som deklarerats som extern "C". Från och med Visual Studio 2019 version 16.3 kan du åsidosätta den här kontrollen med hjälp av kompileringsalternativet /Zc:externC-/permissive- efter alternativet.

Se även

nyckelord
Översättningsenheter och länkning
extern Storage-Class-specificerare i C
Beteende för identifierare i C
Länkning i C