Was bewirkt das Einfügen von extern "C"
in C++-Code genau?
Zum Beispiel:
extern "C" {
void foo();
}
Was bewirkt das Einfügen von extern "C"
in C++-Code genau?
Zum Beispiel:
extern "C" {
void foo();
}
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.
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.
@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.
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.
Verstümmelt ist der Begriff, der normalerweise verwendet wird... Ich glaube nicht, dass ich jemals 'dekoriert' in diesem Sinne gesehen habe.
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
.
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 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.
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.