Ich schrieb eine C++ - Funktion, die ich aus einem C-Programm aufrufen muss. Um es von C abrufbar zu machen, spezifizierte ich extern "C"
auf der Funktion Erklärung. Ich kompilierte dann den C++ Code, aber der Compiler (Dignus Systems/C++) erzeugte für die Funktion einen mangled name. Also, es offenbar nicht die extern "C"
.Wird extern "C" nur zur Funktionsdeklaration benötigt?
Um dies zu beheben, fügte ich extern "C"
zu der Funktion Definition. Danach erzeugte der Compiler einen Funktionsnamen, der von C aufrufbar ist.
Technisch muss der extern "C"
nur in der Funktionsdeklaration angegeben werden. Ist das richtig? (Die C++ FAQ Lite hat ein gutes Beispiel dafür.) Sollten Sie es auch in der Funktionsdefinition angeben?
Hier ist ein Beispiel, dies zu demonstrieren:
/* ---------- */
/* "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...
}
Mein Problem das Ergebnis falsch Codierung etwas kann, oder ich kann einen Compiler Fehler gefunden haben. In jedem Fall wollte ich stackoverflow abfragen, um sicherzugehen, dass ich weiß, was technisch der "richtige" Weg ist.
Sind Sie sicher, dass Sie tatsächlich das Mangeln von foo bekommen, wenn Sie das externe "C" in foo.c in dem Beispielcode, den Sie anzeigen, weglassen? Oder war das nur etwas, das in einem anderen komplizierteren Code auftrat? Ich habe dieses Problem oft als Symptom des Vergessens gesehen, foo.h in foo.c. –
@Brooks Moses: Das ist ein großer Punkt. In meinem eigentlichen Code, der etwas komplexer ist als dieses "foo" Beispiel, füge ich den Header in die Quelldatei "cpp" ein. Was mich dazu gebracht hat zu denken, dass der Compiler den Namen gemangelt hat, war folgender: Wenn ich das 'extern' C '' nicht in die Funktionsdefinition einbeziehe, dann zeigt die Compilerliste das externe Symbol "foo_FPFPCc_v". Wenn das 'extern' C '' enthalten ist, zeigt die Auflistung das externe Symbol, "foo". – bporter
@bporter - es könnte interessant sein zu experimentieren mit dem, was der Compiler mit Ihrem vereinfachten Beispiel macht. Wenn es das gleiche Verhalten zeigt, möchten Sie möglicherweise eine Notiz an den Anbieter senden. Wenn dies nicht der Fall ist, sollten Sie herausfinden, was in Ihrem echten Build vor sich geht, da dies bedeuten würde, dass der falsche Header eingefügt wird (oder etwas anderes die Funktionsdeklaration verpasst). –