2166 Stimmen

Was bewirkt extern "C" in C++?

Was bewirkt das Einfügen von extern "C" in C++-Code genau?

Zum Beispiel:

extern "C" {
   void foo();
}

119 Stimmen

Ich möchte Ihnen diesen Artikel vorstellen: http://www.agner.org/optimize/calling_conventions.pdf Er erzählt Ihnen viel mehr über Aufrufkonventionen und die Unterschiede zwischen Compilern.

34voto

Sander Mertens Punkte 869

Für eine C-Überschrift ist es nicht möglich, sie einfach durch Verpacken in extern "C" kompatibel mit C++ zu machen. Wenn Bezeichner in einer C-Überschrift mit C++-Schlüsselwörtern in Konflikt geraten, wird der C++-Compiler darüber klagen.

Beispielsweise habe ich gesehen, dass der folgende Code in einem g++ versagt:

extern "C" {
struct method {
    int virtual;
};
}

Eine gewisse Logik ergibt das, aber es ist etwas, woran man denken sollte, wenn man C-Code nach C++ portiert.

22 Stimmen

extern "C" bedeutet, C-Verknüpfung zu verwenden, wie es in anderen Antworten beschrieben wurde. Es bedeutet nicht, den Inhalt als C zu kompilieren oder etwas dergleichen. int virtual; ist in C++ ungültig, und das Angeben einer anderen Verknüpfung ändert daran nichts.

3 Stimmen

... oder im Allgemeinen wird jeder Code mit Syntaxfehler nicht kompiliert.

4 Stimmen

@ValentinHeinitz natürlich, obwohl es in C kein Syntaxfehler ist, "virtual" als Bezeichner zu verwenden. Ich wollte nur darauf hinweisen, dass Sie nicht automatisch irgendeinen C-Header in C++ verwenden können, indem Sie extern "C" darum herum setzen.

33voto

Employed Russian Punkte 180738

Es ändert die Verknüpfung einer Funktion so, dass die Funktion von C aus aufgerufen werden kann. In der Praxis bedeutet das, dass der Funktionsname nicht umgewandelt wird.

3 Stimmen

Verstümmelt ist der Begriff, der normalerweise verwendet wird... Ich glaube nicht, dass ich jemals 'dekoriert' in diesem Sinne gesehen habe.

3 Stimmen

Microsoft verwendet (zumindest teilweise) in ihrer Dokumentation den Begriff "decorated" anstelle von "mangled". Sie benennen ihr Tool, um einen Namen zu entcodieren (alias un-mangle), sogar undname.

27voto

Mark Rushakoff Punkte 236626

Es informiert den C++-Compiler, die Namen dieser Funktionen während des Verknüpfens im C-Stil nachzuschlagen, da die Namen von in C und C++ kompilierten Funktionen während des Verknüpfungsprozesses unterschiedlich sind.

13voto

Flami Punkte 507

extern "C" soll von einem C++-Compiler erkannt werden und dem Compiler mitteilen, dass die angegebene Funktion im C-Stil kompiliert wird (oder kompiliert werden soll), damit beim Verknüpfen die richtige Version der Funktion aus C verlinkt wird.

7voto

Yogeesh H T Punkte 2411

extern "C" ist eine Verknüpfungsspezifikation, die verwendet wird, um C-Funktionen in den Cpp-Quelldateien aufzurufen. Wir können C-Funktionen aufrufen, Variablen schreiben und Header einbinden. Die Funktion wird in einer externen Entität deklariert und außerhalb definiert. Die Syntax ist

Typ 1:

extern "language" Funktion-Prototyp

Typ 2:

extern "language"
{
     Funktion-Prototyp
};

z.B.:

#include
using namespace std;

extern "C"
{
     #include    // C-Header einbinden
     int n;               // Eine Variable deklarieren
     void func(int,int);  // Eine Funktion deklarieren (Funktions-Prototyp)
}

int main()
{
    func(int a, int b);   // Funktion aufrufen . . .
    return 0;
}

// Funktion definieren . . .
void func(int m, int n)
{
    //
    //
}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X