C und C ++ Codierungsstandards

8

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.

    
jcodeninja 12.11.2008, 11:48
quelle

6 Antworten

7

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:

%Vor%

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.

    
Graeme Perrow 12.11.2008 11:53
quelle
3

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.

    
Sunlight 12.11.2008 11:57
quelle
3

Man sollte allgemein annehmen, dass c ++ Ausnahmen auslösen kann, daher sollten die c-Wrapper-Funktionen in Ihrem Block sie fangen und in nette Fehlercodes verwandeln, die der c-Aufrufer verdauen kann.

%Vor%     
EvilTeach 12.11.2008 19:33
quelle
1

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.

    
CesarB 12.11.2008 12:34
quelle
1

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.

    
David Allan Finch 12.11.2008 12:47
quelle
0

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 ++

    
Martin York 12.11.2008 12:31
quelle

Tags und Links