Was sind Best Practices in Bezug auf C- und C ++ - Codierungsstandards? Sollten die Entwickler es schaffen, sie zusammen zu mischen? Gibt es Komplikationen beim Verknüpfen von C- und C ++ - Objektdateien?
Sollten Dinge wie Socket-Bibliotheken, die traditionell in C geschrieben sind, in C bleiben und in separaten Quelldateien gespeichert werden? Das hält C-Code in .c-Dateien und C ++ - Code in CPP-Dateien. Wenn C und C ++ nach dem Parsen mit g ++ gemischt werden, kommt es zu Leistungseinbußen, da in C keine typsicheren Überprüfungen durchgeführt werden. aber sind in C ++. Wäre der beste Weg, um C- und C ++ - Quellcode-Dateien zu verknüpfen.
Das größte Problem ist das Aufrufen einer C-Funktion aus C ++ - Code oder umgekehrt. In diesem Fall möchten Sie sicherstellen, dass Sie die Funktion mit "C" verknüpfen, indem Sie extern "C"
verwenden. Sie können dies direkt in der Header-Datei tun:
Sie benötigen die #if
s, weil C-Code, der sie enthält, extern "C"
nicht versteht.
Wenn Sie die Header-Datei nicht ändern möchten (oder können), können Sie dies im C ++ - Code tun:
%Vor%Sie können eine C ++ - Funktion auf die gleiche Weise als C-Verknüpfung markieren, und dann können Sie sie aus C-Code aufrufen. Sie können dies nicht für überladene Funktionen oder C ++ - Klassen tun.
Abgesehen davon sollte es kein Problem geben, C und C ++ zu mischen. Wir haben eine Reihe von jahrzehntealten C-Funktionen, die immer noch von unserem C ++ - Code verwendet werden.
C ++ führt zur Laufzeit keine 'typsicheren Prüfungen' durch, es sei denn, Sie fragen nach ihnen (mit dynamic_cast
). C ++ ist sehr kompatibel mit C, so dass Sie beliebig C-Bibliotheken aufrufen und C-Code mit einem C ++ - Compiler kompilieren können. C ++ impliziert nicht "objektorientiert", und Sie sollten keine Leistungseinbußen durch die Verwendung erleiden.
Wenn Sie Code mischen, der mit gcc und mit g ++ kompiliert wurde, sehen Sie sich die Antwort von Graeme an.
Wenn Sie eine Funktion in C ++ haben, die eine Funktion in C aufruft, die wiederum eine andere Funktion in C ++ aufruft, und diese spätere Funktion eine Ausnahme auslöst, die von der ersten Funktion abgefangen werden soll, können Sie Probleme haben, wenn Sie dem C nicht gesagt haben Compiler, um die Generierung der Ausnahmebehandlungstabellen zu ermöglichen.
Für gcc ist dies die -fexceptions
Parameter, der standardmäßig für C ++ aktiviert ist, aber standardmäßig für C deaktiviert ist.
Hier gibt es keine guten Regeln.
Wenn das Endprodukt immer mit einem C ++ main () verknüpft wird, spielt es keine Rolle. Da Sie immer Header erstellen können, die das Richtige tun.
Wenn Sie eine Bibliothek erstellen, die eine C- und C ++ - Schnittstelle haben muss, aber Sie den C ++ - Linker nicht annehmen können, müssen Sie sicherstellen, dass Sie die C-API sauber von C ++ getrennt haben. An diesem Punkt ist es in der Regel sauberer, die ganze Arbeit in C zu erledigen und C ++ - Klassen zu verwenden, um sich an das C anzuschließen.
Zum Beispiel:
%Vor%Ich hoffe, das hilft.
Wenn Sie Ihre gesamte Quelle mit g ++ kompilieren, wird alles in C ++ - Objektdateien kompiliert (d. h. mit dem entsprechenden Namen mangling und dem C ++ - ABI).
Sie müssen nur den externen C-Trick verwenden, wenn Sie Bibliotheken erstellen, die explizit von C-Anwendungen verwendet werden müssen, die den C ABI verwenden müssen.
Wenn alles in eine einzelne ausführbare Datei kompiliert wird, dann benutze g ++ und behandle alles als C ++