extern (C++)

Die extern Schlüsselwort (keyword) kann auf eine globale Variable, Funktion oder Vorlagendeklaration angewendet werden. Es gibt an, dass das Symbol eine Verknüpfung hatextern. Hintergrundinformationen zur Verknüpfung und dazu, warum die Verwendung von globalen Variablen abgeraten wird, finden Sie unter Übersetzungseinheiten und Verknüpfungen.

Die extern Schlüsselwort (keyword) hat je nach Kontext vier Bedeutungen:

  • Gibt in einer nicht globalenconst Variablendeklaration an, extern dass die Variable oder Funktion in einer anderen Übersetzungseinheit definiert ist. Dies extern muss in allen Dateien angewendet werden, mit Ausnahme der Datei, in der die Variable definiert ist.

  • In einer const Variablendeklaration gibt sie an, dass die Variable eine Verknüpfung hat extern. Dies extern muss auf alle Deklarationen in allen Dateien angewendet werden. (Globale const Variablen weisen standardmäßig eine interne Verknüpfung auf.)

  • extern "C" Gibt an, dass die Funktion an anderer Stelle definiert ist und die C-Sprache-Aufrufkonvention verwendet. Der extern "C" Modifizierer kann auch auf mehrere Funktionsdeklarationen in einem Block angewendet werden.

  • Gibt in einer Vorlagendeklaration an, extern dass die Vorlage bereits an anderer Stelle instanziiert wurde. extern teilt dem Compiler mit, dass er die andere Instanziierung wiederverwenden kann, anstatt eine neue instanziiert an der aktuellen Position zu erstellen. Weitere Informationen zu dieser Verwendung externfinden Sie unter Explizite Instanziierung.

externVerknüpfung für Nicht-Globalenconst

Wenn der Linker vor einer globalen Variablendeklaration sieht extern , wird in einer anderen Übersetzungseinheit nach der Definition gesucht. Deklarationen von Nichtvariablenconst im globalen Bereich sind externstandardmäßig al. Gilt nur für extern die Deklarationen, die die Definition nicht angeben.

//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 Verknüpfung für const Globalen

Eine const globale Variable weist standardmäßig eine interne Verknüpfung auf. Wenn die Variable eine Verknüpfung aufweisen externsoll, wenden Sie die extern Schlüsselwort (keyword) auf die Definition und alle anderen Deklarationen in anderen Dateien an:

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

In Visual Studio 2017, Version 15.3 und früher, gab der Compiler immer eine constexpr variable interne Verknüpfung, auch wenn die Variable markiert externwurde. In Visual Studio 2017, Version 15.5 und höher, ermöglicht der /Zc:externConstexpr Compilerschalter das richtige Standardkonformierungsverhalten. Schließlich wird die Option zum Standard. Die /permissive- Option ist nicht aktiviert /Zc:externConstexpr.

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

Wenn eine Headerdatei eine variable deklariert externconstexprenthält, muss sie markiert __declspec(selectany) werden, damit die doppelten Deklarationen kombiniert werden:

extern constexpr __declspec(selectany) int x = 10;

extern "C" und extern "C++" Funktionsdeklarationen

In C++ wird bei Verwendung mit einer Zeichenfolge angegeben, extern dass die Verknüpfungskonventionen einer anderen Sprache für die Deklaratoren verwendet werden. Auf C-Funktionen und -Daten kann nur zugegriffen werden, wenn sie zuvor als C-Verknüpfung deklariert wurden. Allerdings müssen sie in einer separat kompilierten Übersetzungseinheit definiert sein.

Microsoft C++ unterstützt die Zeichenfolgen "C" und "C++" im Zeichenfolgenliteralfeld . Alle Standarddateien verwenden die extern "C" Syntax, damit die Laufzeitbibliotheksfunktionen in C++-Programmen verwendet werden können.

Beispiel

Das folgende Beispiel zeigt, wie Namen mit C-Verknüpfung deklariert werden:

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

Wenn eine Funktion mehrere Verknüpfungsspezifikationen enthält, müssen sie zustimmen. Fehler beim Deklarieren von Funktionen als C- und C++-Verknüpfung. Wenn zwei Deklarationen für eine Funktion in einem Programm auftreten, muss eine mit einer Verknüpfungsspezifikation und eine ohne die Deklaration mit der Verknüpfungsspezifikation zuerst sein. Alle redundanten Deklarationen von Funktionen, die bereits eine Verknüpfungsspezifikation haben, erhalten die in der ersten Deklaration angegebene Bindung. Beispiel:

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.

Ab Visual Studio 2019 überprüft der Compiler, ob /permissive- die Deklarationen von extern "C" Funktionsparametern ebenfalls übereinstimmen. Sie können eine Als extern "C"deklarierte Funktion nicht überladen. Ab Visual Studio 2019, Version 16.3, können Sie diese Überprüfung überschreiben, indem Sie die /Zc:externC- Compileroption nach der /permissive- Option verwenden.

Siehe auch

Schlüsselwörter
Übersetzungseinheiten und Verknüpfung
extern Speicherklassenbezeichner in C
Verhalten von Bezeichnern in C
Verknüpfung in C