Ich arbeite an einem Projekt, das viel alten C- Code enthält. Wir haben mit dem Schreiben in C ++ begonnen, mit der Absicht, den Legacy-Code schließlich auch zu konvertieren. Ich bin ein wenig verwirrt darüber, wie C und C ++ interagieren. Ich verstehe, dass durch das Umschließen des C- Codes mit extern "C"
dem C ++ - Compiler die Namen des C- Codes nicht entstellt werden, aber ich bin mir nicht ganz sicher, wie ich dies implementieren soll.
Also, oben in jeder C- Header-Datei (nach den Include-Wachen) haben wir
#ifdef __cplusplus
extern "C" {
#endif
und unten schreiben wir
#ifdef __cplusplus
}
#endif
Dazwischen haben wir alle unsere Includes, Typedefs und Funktionsprototypen. Ich habe ein paar Fragen, um zu sehen, ob ich das richtig verstehe:
Wenn ich eine C ++ - Datei A.hh habe, die eine C- Header-Datei Bh enthält, eine andere C- Header-Datei Ch enthält, wie funktioniert das? Ich denke, wenn der Compiler in Bh eintritt,
__cplusplus
wird er definiert, so dass er den Code umschließtextern "C"
(und__cplusplus
nicht in diesem Block definiert wird). Wenn es also in Ch eintritt,__cplusplus
wird es nicht definiert und der Code wird nicht eingewickeltextern "C"
. Ist das richtig?Ist etwas falsch daran, ein Stück Code damit zu verpacken
extern "C" { extern "C" { .. } }
? Was wird der 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? Hält der Compiler es für eine C ++ - Funktion?
Wir verwenden auch Code von Drittanbietern, der in C geschrieben ist und keinen solchen Wrapper enthält. Jedes Mal, wenn ich einen Header aus dieser Bibliothek einbinde, habe ich ein
extern "C"
#include eingefügt. Ist das der richtige Weg, um damit umzugehen?Ist dies eine gute Idee? Gibt es noch etwas, was wir tun sollten? Wir werden auf absehbare Zeit C und C ++ mischen , und ich möchte sicherstellen, dass wir alle unsere Grundlagen abdecken.