Ich arbeite an einem Projekt, das eine Menge Altlasten enthält. C Code. Wir haben begonnen, in C++ zu schreiben, mit der Absicht, auch den alten Code zu konvertieren. Ich bin ein wenig verwirrt darüber, wie die C und C++ interagieren. Ich verstehe, dass durch die Ummantelung der C Code mit extern "C"
wird der C++-Compiler die C Namen des Codes, aber ich bin mir nicht ganz sicher, wie ich das umsetzen soll.
Am Anfang eines jeden C Header-Datei (nach den Include-Guards), haben wir
#ifdef __cplusplus
extern "C" {
#endif
und am Ende schreiben wir
#ifdef __cplusplus
}
#endif
Dazwischen befinden sich alle Includes, Typedefs und Funktionsprototypen. Ich habe ein paar Fragen, um zu sehen, ob ich das richtig verstanden habe:
-
Wenn ich eine C++-Datei A.hh habe, die enthält eine C Header-Datei B.h, enthält eine weitere C Header-Datei C.h, wie funktioniert das? Ich denke, dass wenn der Compiler in B.h einsteigt,
__cplusplus
definiert werden, so dass es verpackt den Code mitextern "C"
(und__cplusplus
wird nicht innerhalb dieses Blocks definiert). Also, wenn es in C.h eintritt,__cplusplus
wird nicht definiert und der Code wird nicht inextern "C"
. Ist dies korrekt? -
Ist etwas falsch mit ein Stück Code zu umhüllen mit
extern "C" { extern "C" { .. } }
? Was wird die zweiteextern "C"
tun? -
Wir legen diesen Wrapper nicht um die .c-Dateien, sondern nur um die .h-Dateien. Was passiert also, wenn eine Funktion keinen Prototyp hat? Denkt der Compiler, dass es sich um eine C++-Funktion handelt?
-
Wir verwenden auch einige Drittanbieter Code, der in C und tut diese Art von Umhüllung nicht hat sie. Jedes Mal, wenn ich eine Kopfzeile aus dieser Bibliothek einbinde, habe ich ein
extern "C"
um das #include herum. Ist das der richtige Weg, um damit umzugehen damit umzugehen? -
Und schließlich: Ist diese Einrichtung eine gute Idee? Gibt es noch etwas, was wir tun sollten? Wir werden Folgendes mischen C und C++ für die absehbare Zukunft, und ich möchte sicherstellen, dass wir alle Grundlagen abdecken.