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,
__cpluspluswird er definiert, so dass er den Code umschließtextern "C"(und__cplusplusnicht in diesem Block definiert wird). Wenn es also in Ch eintritt,__cpluspluswird 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.