Freigeben über


Verknüpfungsangaben

Der Begriff "Verknüpfungsspezifikation" bezieht sich auf das Protokoll zum Verknüpfen von den Funktionen (oder Prozeduren), die in verschiedenen Sprachen geschrieben sind. Die folgenden Aufrufkonventionen sind betroffen:

  • Groß- und Kleinschreibung bei Namen

  • Ergänzung von Namen. In C ist die Compilerpräfix für Namen ein Unterstrich. Dies wird häufig als "Namensergänzung" bezeichnet. In C++ wird die Namensergänzung verwendet, um Typinformationen durch die Bindungsphase hindurch beizubehalten. (Weitere Informationen finden Sie unter Ergänzte Namen.)

  • Reihenfolge, in der Argumente im Stapel erwartet werden

  • Aufgaben zum Anpassen des Stapels bei Funktionsrückgabe Entweder ist die aufgerufene Funktion oder die aufrufende Funktion verantwortlich.

  • Übergeben von ausgeblendeten Argumenten (ob jegliche ausgeblendeten Argumente übergeben werden)

extern string-literal { declaration-list }
extern string-literal declaration

Die Verknüpfungsspezifikation ermöglicht das graduelle Portieren des C-Codes zu C++, indem sie die Verwendung des existierenden Codes zulässt.

Microsoft-spezifisch

Derzeit werden nur die Bindungsangaben "C" und "C++" von Microsoft C++ unterstützt.

END Microsoft-spezifisch

Im folgenden Beispiel werden die Funktionen atoi und atol mit einer C-Verknüpfung deklariert:

extern "C"
{
    int  atoi( char *string );
    long atol( char *string );
}

Aufrufe zu diesen Funktionen werden mit C-Bindung gemacht. Das gleiche Ergebnis könnte mit diesen beiden Deklarationen erreicht werden:

extern "C" int  atoi( char *string );
extern "C" long atol( char *string );

Microsoft-spezifisch

Alle Microsoft C-Standardincludedateien verwenden Direktiven für die bedingte Kompilierung, um C++-Kompilierung zu erkennen. Wenn eine Kompilierung in C++ erkannt wird, werden die Prototypen wie folgt in eine extern "C"-Direktive eingeschlossen:

// Sample.h
#if defined(__cplusplus)
extern "C"
{
#endif

// Function declarations

#if defined(__cplusplus)
}
#endif 

END Microsoft-spezifisch

Sie müssen keine Funktionen in den standardmäßigen include-Dateien als extern "C" deklarieren.

Wenn eine Funktion überladen ist, kann nur eine der gleichnamigen Funktionen einen Bindungsspezifizierer besitzen. Weitere Informationen hierzu finden Sie unter Funktionsüberladung.

Die folgende Tabelle zeigt, wie verschiedene Verknüpfungsspezifikationen funktionieren.

Auswirkungen von Verknüpfungsspezifikationen

Spezifikation

Auswirkung

In einem Objekt

Beeinflusst Bindung nur dieses Objekts

In einer Funktion

Beeinflusst die Bindung dieser Funktion und alle Funktionen oder Objekte, in der sie deklariert werden

Bei einer Klasse

Beeinflusst die Bindung aller Nichtmemberfunktionen und Objekte, die innerhalb der Klasse deklariert werden

Wenn eine Funktion über mehr als eine Verknüpfungsspezifikation verfügt, müssen sie übereinstimmen. Es ist ein Fehler, Funktionen sowohl mit C- als auch mit C++-Bindung zu deklarieren. Wenn darüber hinaus zwei Deklarationen für eine Funktion in einem Programm auftreten – eine mit einer Verknüpfungsspezifikation und eine ohne – muss die Deklaration mit der Verknüpfungsspezifikation die erste 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.

Funktionen und Objekte, die explizit als static innerhalb des Rumpfes eines zusammengesetzten Bindungsspezifizierers ({}) deklariert sind, werden als statische Funktionen oder Objekte behandelt. Der Bindungsspezifizierer wird ignoriert. Andere Funktionen und Objekte verhalten sich so, als wären sie unter Verwendung des extern-Schlüsselworts deklariert worden. (Weitere Informationen zu diesem Schlüsselwort erhalten Sie unter Using extern to Specify Linkage extern.)

Siehe auch

Referenz

Verwenden von "extern" zur Angabe der Verknüpfung