Ich möchte nur bestätigen in Windows-Umgebung, VSTS 2008 + C ++ - Projekt, wir könnten nur extern C auf Funktionsebene anwenden, nicht auf Klassenebene anwenden können (so dass alle Mitgliedsfunktionen aus der Klasse den Namen der C-Sprache verwenden) ? Ich habe mehrere Möglichkeiten ausprobiert, aber immer Fehler kompilieren.
danke im voraus, George
Sie können extern "C"
über einen sehr komplizierten (aber völlig legalen) Hack auf eine Member-Funktion anwenden:
Dies ist möglich gemäß ISO C ++ 03 9.3 [class.mfct] / 9:
Eine Memberfunktion kann mit einem typedef für einen Funktionstyp deklariert (aber nicht definiert) werden. Die resultierende member-Funktion hat genau den gleichen Typ, als wenn der Funktionsdeklarator explizit bereitgestellt würde, siehe 8.3.5.
Allerdings kauft Ihnen das wegen ISO C ++ 03 7.5 [dcl.link] / 4:
nichts wirklichEine C-Sprachverknüpfung wird für die Namen der Klassenmitglieder und der Mitgliedsfunktion ignoriert Art der Klassenmitgliedsfunktionen.
extern "c" verwendet eine C-Style-Verknüpfung; Das heißt, der Name der RAW-Funktion wird von der Bibliothek ausgegeben. Da es sich um einen reinen Funktionsnamen handelt, kann keine der C ++ - Funktionen verwendet werden, einschließlich Methoden oder externen Datenmembern in Namespaces, Klassen, Strukturen oder Unionen.
Klärung : Strukturen und Vereinigungen sind in C, haben aber keine Mitgliedsfunktionen, daher können ihre Elementfunktionen in C ++ nicht im C-Stil exportiert werden (und die Struktur- und Vereinigungsdefinitionen müssen nicht exportiert werden) , da es bereits im Header steht)
Betrachten Sie einen Kommentar, den Sie auf eine vorherige Antwort gesetzt haben ("[M] y question ist nur, ob wir extern C
auf Klassenebene anwenden könnten, so dass alle Funktionen in der Klasse automatisch C-style name mangling haben?", lautet die Antwort ist ' extern "C"
funktioniert nicht ganz so.'
Syntaktisch kann extern "C"
auf eine einzelne Anweisung eines durch Blocktrennzeichen getrennten Blocks angewendet werden:
Es ist üblich, extern "C"
mit den entsprechenden #ifdef __cplusplus
-Wachen für ganze C-Header zu verwenden.
Semantisch wird der tatsächliche Effekt der Anwendung von extern "C"
nur auf "normale" (d. h. Nicht-Klassen-) Funktionen und Zeiger auf Funktionen angewendet. Natürlich können Sie es nicht auf eine C ++ Vorlage anwenden. Sie können es auch nicht auf Klassenmethoden anwenden (weil eine Klassenmethode wissen muss, an welchem Objekt sie aufgerufen wurde, und C-Style-Verknüpfungen haben keine Möglichkeit, diese Informationen an die Funktion zu übergeben).
Es ist möglich, extern "C"
auf Funktionen anzuwenden, die in einem Namespace vorhanden sind, aber die Namespace-Informationen verschwinden einfach, wenn sie über C verwendet werden.
Wenn Sie bereits eine Klasse haben (wir verwenden eine POD class zur Vereinfachung), und Sie möchten es von C aus nutzbar machen, müssen Sie extern "C"
auf eine Funktion anwenden, die in C aufgerufen werden kann. Leider wird dies selbst in einfachen Fällen hässlich:
Mit gcc kompilieren Sie dies wie folgt:
g++ try.cc -c -o try.o
gcc try.c try.o
Es gibt ein paar wichtige Punkte:
new
oder delete
(oder new[]
oder delete[]
) aufruft, müssen Sie das endgültige Programm mit der C ++ - Laufzeitbibliothek (dem Befehl) verknüpfen Zeilenumschaltung dafür in gcc ist -lstdc++
. Um den Destruktor explizit aufzurufen:
%Vor%Tags und Links c c++ visual-studio-2008 extern