Ist die extern "C" ausschließlich an der Deklaration der Funktion?
Schrieb ich eine C++ - Funktion, die ich aufrufen müssen, die von einem C-Programm. Um es callable von C, die ich angegeben extern "C"
auf die Funktion Erklärung. Ich habe dann kompiliert der C++ - code, aber der compiler (Dignus Systeme/C++) erzeugt eine entstellte Namen für die Funktion. So, es hat offensichtlich nicht die Ehre extern "C"
.
Diese zu lösen, fügte ich extern "C"
um die Funktion definition. Nach diesem, den vom compiler generierten Funktion name, callable von C.
Technisch ist die extern "C"
muss nur angegeben werden, auf die Deklaration der Funktion. Ist das richtig? (Die C++ FAQ Lite ist ein gutes Beispiel dafür.) Sollten Sie auch angeben, es auf die definition der Funktion?
Hier ist ein Beispiel um dies zu veranschaulichen:
/* ---------- */
/* "foo.h" */
/* ---------- */
#ifdef __cplusplus
extern "C" {
#endif
/* Function declaration */
void foo(int);
#ifdef __cplusplus
}
#endif
/* ---------- */
/* "foo.cpp" */
/* ---------- */
#include "foo.h"
/* Function definition */
extern "C" //<---- Is this needed?
void foo(int i) {
//do something...
}
Meine Frage kann das Ergebnis falsch-Codierung etwas, oder ich fand einen compiler-Fehler. In jedem Fall, ich wollte zu konsultieren, stackoverflow, um sicherzustellen, dass ich weiß, was technisch ist der "richtige" Weg.
InformationsquelleAutor der Frage bporter | 2009-09-04
Du musst angemeldet sein, um einen Kommentar abzugeben.
'
extern "C"
' Sollte nicht verlangt werden, auf die Funktion Definition, solange die Erklärung hat es und ist schon in der Zusammenstellung der defintion. Der standard ausdrücklich fest (7.5/5 Verknüpfung Spezifikationen):Allerdings habe ich in der Regel tun die '
extern "C"
' auf die Definition, denn es ist in der Tat eine Funktion mit extern "C" - Verknüpfung. Eine Menge Leute hasse es, wenn unnötige, überflüssige Kram wird auf die Erklärungen (wie wenn manvirtual
auf Methode überschreibt), aber ich bin nicht einer von Ihnen.InformationsquelleAutor der Antwort Michael Burr
Edit:
Scheint so, als hätte ich falsch verstanden, die Frage.
Na ja, ich habe versucht:
Mithilfe des Befehls
nm
zum anzeigen der Symbole aus der kompilierten Datei:Dieser klar darauf hin, dass der name der deklarierten Funktion als extern "C" ist nicht entstellt und die extern "C" Schlüsselwort ist nicht erforderlich, bei der definition.
Hatte es nötig, jede C-Bibliothek code geschrieben, ohne extern "C" gewesen wäre unbrauchbar in C++ - Programmen.
InformationsquelleAutor der Antwort sud03r
Nur begegnet dieser situation... Nicht eine angenehme Erfahrung.
Folgenden erklärt wurde, in einem meiner
c
Dateien:Nächsten irgendwo in einer
cpp
Datei, die ich definiert:Ich habe noch vergessen zu ändern, die forward-Deklaration:
Es dauerte eine Weile, bis ich herausgefunden, ich mache alles richtig mit Bezug auf die AD-Wandlung, aber ich konnte nicht fügen Sie die "extern C", um die definition!
Nur meine zwei Cent-warum könnte es sinnvoll sein, in bestimmten Fällen, um die Gewohnheit auf hinzufügen, um die definition als gut.
InformationsquelleAutor der Antwort Anne van Rossum
Ich denke, das muss hier geklärt werden, wie ich hatte gerade ein ähnliches Problem und es dauerte eine Weile, bis dieses klar in meinem Kopf, nur Brooks Moses berührte das richtig, und ich denke, es muss angegeben werden, um mehr klar ...
In der Zusammenfassung der header werfen Sie Weg, ist alles, der compiler sieht, ist die cpp-Datei, und wenn der header nicht mit dem extern "C" wieder in Ihre cpp (was ich Häufig sehe), dann ist die extern "C" müssen in der cpp-Datei, die irgendwo (entweder in der definition, oder eine andere Erklärung), so dass die CXX compiler wissen kann, um es mit C-linkage, der compiler kümmert sich nicht um den header, nur der linker.
InformationsquelleAutor der Antwort othane
Den
extern "C"
um die definition ist nicht erforderlich. Sie können sich mit nur setzen Sie es um die Erklärung. Ein Hinweis in deinem Beispiel...Ihrem code nach dem Präprozessor-makro "
__cplusplus
".Während es allgemein implementiert, je nach compiler, dies kann oder kann nicht definiert werden. In Ihrem Beispiel verwenden Sie auch
extern "C"
um die Erklärung, aber es gibt Sie nicht Prüfung für das "__cplusplus
" makro, das ist der Grund, warum ich vermute, dass es funktionierte, sobald du das getan hast.Siehe die Kommentare unten — C++ - Standard erfordert die
__cplusplus
makro definiert werden, die durch den Präprozessor.InformationsquelleAutor der Antwort
Sollte es werden, rund um die beiden. Der compiler muss wissen, mit dem C-symbol-namens-und Aufrufkonventionen bei der Zusammenstellung der Aufruf von Websites (ggf. nur eine Erklärung), und der compiler muss auch wissen zu generieren, das C symbol-Namen und verwenden Sie die C-Aufrufkonventionen beim kompilieren die definition der Funktion selbst (die können nicht sehen, alle anderen Deklarationen).
Nun, wenn Sie haben ein extern-C-Deklaration sichtbar ist, von der übersetzung, in welcher Einheit die definition vorhanden ist, können Sie in der Lage sein, um Weg mit verlassen der extern-C aus der definition, aber ich weiß nicht, das ist sicher.
InformationsquelleAutor der Antwort Tyler McHenry