extern C kann nicht verwendet werden, die auf Klassen-Ebene?
Wollen einfach nur, um zu bestätigen, in der Windows-Umgebung, VSTS 2008 + C++ - Projekt, das wir nur anwenden, extern C, um die Funktion Ebene, nicht in der Lage, gelten für Ebene (Klasse, so dass alle member-Funktionen von der Klasse C language name mangling)? Ich habe versucht, mehrere Möglichkeiten, aber immer kompilieren Fehler.
vielen Dank im Voraus,
George
- Da C keine Vorstellung von Klassen und member-Funktionen, es macht keinen Sinn zu geben, die member-Funktionen der direkten C-level-Verknüpfung. Was wollen Sie wirklich?
- Ich möchte meine Eingabe und flexibler in meinem code, d.h. ich definiere eine Klasse-level-extern-C-option, dann werden alle folgenden neben der member-Funktionen auf die Klasse automatisch "Erben" diese option. Irgendwelche Kommentare oder Ideen?
- Für welchen Zweck? Zu können, rufen Sie die member-Funktionen von C? (Nicht ohne eine Umleitung.) Haben unmangled Namen in die Objekte? (Nicht möglich, Namensraum-Kollisionen.)
- Ich möchte bestätigen Sie, dass die Funktionen der C++ - Klasse kann nicht exportiert werden, mit extern C, wie können wir export-member-Funktion? Definieren Globale Funktion-wrapper und-export-Funktion-wrapper?
- mein Ziel ist einfach-speichern Sie die Eingabe und flexibler in meinen code, möchte ich definieren extern " C einmal in eine Globale header-Dateien und gelten für alle Funktionen die ich brauche zu exportieren, mit C-style-name mangling.
- Ich sehe nicht, wie
extern "C"
hilft, alle diese Ziele zu erreichen. Geben Sie ein Beispiel Verwendungszweck, bitte. - Die Frage, die Menschen Fragen sich: warum möchten Sie die export-Funktionen der Klasse mit C-Verknüpfung? Unabhängig von der Menge der Eingabe, diese kann nehmen, was ist der Punkt von diesem. Normalerweise werden Menschen, die export-Funktionen mit C-Verknüpfung, um Sie linkable und callable von C-code. Aber die Funktionen der Klasse sind von Natur aus nicht kündbaren von C-code. Auch wenn Sie zu verwalten, zu exportieren, um Sie mit C linkage irgendwie, Sie will immer noch nicht in der Lage, Sie zu nennen. Die Frage ist also: was ist der Punkt, der Export in diesem Fall?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Können Sie Art gelten
extern "C"
auf eine member-Funktion über einen sehr verworrenen (aber völlig legal) hack:Dies ist möglich nach ISO C++03 9.3[Klasse.mfct]/9:
Dies bedeutet jedoch nicht, wirklich kaufen Sie nichts, weil der ISO C++03 7.5[dcl.link]/4:
typedef int bar_t(int) const;
in dem Fall, dass die typedef-name wird nur nutzbar für die Deklaration von member-Funktionen, aber nicht die gewöhnlichen Funktionen.extern "c" verwendet, die c-Stil-Verknüpfungen; das ist der raw-Funktion-name ist, was ausgesetzt, die aus der Bibliothek. Denn es ist nur eine raw-Funktion name, keines der C++-features, die nur arbeiten, einschließlich der Verfahren oder externe Daten-member in namespaces, Klassen, Strukturen oder unions.
Klärung: Structs und unions in C, aber keine member-Funktionen, so dass Ihre member-Funktionen in C++ können nicht exportiert werden in eine c-Stil (und die struct-und union-Definitionen müssen nicht exportiert werden, da Sie bereits in der Kopfzeile)
Ich fürchte nicht. Aber wenn Sie wollen, übergeben Sie ein Objekt der C++ - zu-C-Funktionen, können Sie unter diesem link: http://www.parashift.com/c++-faq-lite/mixing-c-und-cpp.html#faq-32.8
Blick auf einen Kommentar, die Sie auf einer vorhergehenden Antwort ("[M]y Frage ist nur, ob wir uns bewerben könnten
extern C
auf Klassen-Ebene, so dass alle Funktionen in der Klasse, hat automatisch die C-style-name mangling?", die Antwort ist 'extern "C"
funktioniert nicht ganz so.'Syntaktisch,
extern "C"
angewendet werden können, um entweder eine einzelne Anweisung einer geschweiften getrennten block:Es ist üblich, verwenden Sie
extern "C"
mit den entsprechenden#ifdef __cplusplus
Wachen auf der ganzen C-Header.Semantisch, die tatsächlichen Auswirkungen der Anwendung
extern "C"
gelten nur für die "normalen" (D. H., non-Klasse) Funktionen und Zeiger auf Funktionen. Natürlich können Sie nicht anwenden, um ein C++ - template. Noch können Sie es anwenden, um Klassenmethoden (weil die Methode einer Klasse kennen muss, um welches Objekt es aufgerufen wurde, und C-Stil Verknüpfung keine Möglichkeit zu passieren, dass die Informationen in der Funktion).Es ist möglich
extern "C"
auf Funktionen, die vorhanden sind in einem namespace, aber der namespace-Informationen werden einfach verschwinden, wenn verwendet, über C.Update
Wenn Sie bereits eine Klasse (wir benutzen ein POD-Klasse für Einfachheit), und Sie wollen nutzbar zu machen, die von C, werden Sie brauchen, um zu übernehmen
extern "C"
eine Funktion aufrufbar ist in C. Leider ist diese häßlich selbst in einfachen Fällen:Gcc verwenden, würden Sie kompilieren Sie diese wie folgt:
g++ try.cc -c -o try.o
gcc try.c try.o
Gibt es ein paar wichtige Punkte:
new
oderdelete
(odernew[]
oderdelete[]
), müssen Sie die link das endgültige Programm an die C++ - runtime-library (die Befehl Linie Schalter für das im gcc ist-lstdc++
.Rufen Sie den Destruktor explizit:
Ähmm...
extern "C"
Kräfte, die C-Stil-Gestänge. Es kann nicht verwendet werden, mit Klassen AFAIK.