Was sind die Unterschiede zwischen der Verwendung von reinem C mit einem C-Compiler und dem "C-Teil" eines C ++ - Compilers?

7

Ich bin mir nicht sicher, was Programmierung in C wirklich bedeutet: - Programmierung in reinem C mit einem C-Compiler oder - Programmierung in C mit einem C ++ - Compiler.

Abgesehen von den Unterschieden zwischen der C-Syntax von C und der C-Syntax von C ++, kann ich sicher sagen, dass es absolut (oder in sehr wenigen Fällen) keine Unterschiede zwischen zwei ausführbaren Dateien in Bezug auf die Leistung gibt?

Ich denke über dieses Problem nach, weil bei der Programmierung von Spielen jeder Teil des Renderings, der Teil des Spielobjekts und der Teil des Spieleskriptings komplett verschiedene Sprachen programmiert werden können, um den besten Kompromiss zwischen Ausführungsgeschwindigkeit und einfacher Entwicklung zu erzielen und das bei jedem dieser Teile.

Diese Trennung zwischen Teilen kann für mich wichtig sein. Ich möchte zum Beispiel eine vielseitige 3D-Abenteuer-Engine entwickeln, in der eine Community ihr eigenes Gameplay erstellen kann, ohne sich mit der Engine herumschlagen zu müssen. Es wäre nur in der Lage, Spiele mit einem einzelnen Charakter und mehreren Enemies zu machen, so dass unterschiedliche Spieltypen abgedeckt würden: hack & amp; Schrägstrich, Infiltration, RPG, Plattform, etc.

Ich hätte diese 2 Absätze in gamedev.stackexchange setzen sollen, aber der erste Teil betrifft nur die Sprachen ...

    
jokoon 05.09.2010, 13:15
quelle

4 Antworten

29

Es gibt viele kleine Nitpicks. Eine, die mir am offensichtlichsten erscheint, ist, dass Sie in C ++ den Rückgabewert von malloc umsetzen müssen. Auch Strukturen werden automatisch in C ++ typedefed.

Verwenden Sie immer einen C-Compiler für C-Code, nicht C ++. C ++ ist nicht perfekt kompatibel mit C.

Ein paar andere:

  • In C deklariert void func(); eine Funktion, die nicht angegeben hat, was ihre Argumente sind, während in C ++ void func(); dem C void func(void)' entspricht und keine Argumente annimmt;
  • In C ++ sind Prototypen erforderlich, während es in C normalerweise nur eine Warnung ist;
  • Der Typ der Zeichenkonstanten (wie 'a' ) ist int in C und char in C ++;
  • Der Typ der Zeichenfolgenliterale ist char [] in C und const char [] in C ++;
  • Einige legitime Variablennamen in C, wie class , sind reservierte Schlüsselwörter in C ++.

Für all diejenigen, die mir nicht glauben und die Sie ablehnen, schauen Sie sich diesen C-Code an:

%Vor%

Die Kompilierung unter gcc ist in Ordnung, aber die Kompilierung unter g++ führt zu folgenden Fehlern:

%Vor%     
alternative 05.09.2010, 13:17
quelle
7

Hinweis: Die Unterschiede zwischen C- und C ++ - Syntax sind bereits in anderen Beiträgen beschrieben ... Dennoch hat mich etwas gestört, um folgende Antwort zu geben:

Wenn ich richtig verstanden habe, möchten Sie zwei separate Teile in einem Programm haben, eins in C und eins in C ++. Einer sollte eigentlich sehr schnell sein und der andere könnte langsamer sein.

Im aktuellen Fall (Vergleich der C- und C ++ - Performance) wird es keinen sichtbaren Unterschied geben, wenn der gleiche C-Code mit einem C- und C ++ - Compiler kompiliert wird ...

Natürlich unterschätzen Sie niemals, wie wichtig die Fähigkeiten des Programmierers für die Leistung eines Programms sind, unabhängig von der Sprache.

Auswahl eines C-Compilers

Vorteile

  • Wenn Sie Glück haben (mit einem kürzlichen gcc oder was auch immer), können Sie die neuen Funktionen von C99 verwenden (beachten Sie, dass C ++ die meisten nützlichen Teile von C99 bereits entweder in der Sprache oder in die Standardbibliothek).
  • Sie werden eine C ++ - Funktion nicht versehentlich verwenden und können daher sicher wetten, dass Sie keine Überraschungen außerhalb der K & amp; R

Nachteile

  • Sie können C ++ - Funktionen nicht verwenden
  • Nicht jeder C-Compiler unterstützt C99 (Visual C ++ arbeitet beispielsweise hart daran, das neue C ++ 0x zu implementieren Standard, aber hat wenig getan, um C99 zu implementieren) ... Sie könnten also mit C89 festgefahren sein Code, wenn Sie mit dem falschen Compiler arbeiten oder auf ihn zielen.

Auswahl eines C ++ Compilers

Vorteile

  • Sie haben Zugriff auf C- und C ++ - Bibliotheken
  • Sie können STL und Boost verwenden
  • Sie werden in der Lage sein, Vorlagencode zu schreiben (d. h. schneller und sicherer als ihre Gegenstücke void * ).
  • Sie werden in der Lage sein, Ihren gesamten Code in C zu schreiben, abgesehen von einigen kleinen Details (C ++ verbietet implizites Casting von void * , etc.). Fakt ist, dass die "kleinen Details" oben als gefährlich angesehen werden, weshalb sie Fehler oder Warnungen auf einem C ++ - Compiler erzeugen.

Nachteile

  • Wenn Sie Funktionen mit der C-Namenskonvention exportieren möchten, müssen Sie den extern "c" -Spezifizierer verwenden.
  • Sie können nicht implizit von void * aus casten (beachten Sie, dass dies nicht oft oder gar nicht in C ++ vorkommen sollte, also ist dies ein vernachlässigbares Problem im Vergleich zu potenziellen Casting-Fehlern).
  • Wenn Sie C ++ - Code schreiben, müssen Sie viel mehr als nur C lernen, um es richtig zu machen ( RAII , Konstruktoren / Destruktoren, Ausnahmen usw.)

Produzieren von C / C ++ Code

Mit C / C ++ meine ich Code, der von C- und C ++ - Compilern korrekt verstanden wird. Während Ihre Sprache der Wahl variieren könnte, werden diese kompatiblen C / C ++ - Header identisch sein (auch wenn Sie in C ++ programmieren und zusätzliche C ++ - Header für C ++ - Benutzer Ihres Codes bereitstellen)

Damit Ihr C-Code mit dem C ++ - Code anderer kompatibel ist:

  • Verzieren Sie Ihre Funktionsdeklarationen mit einem extern "C" -Spezifizierer, umhüllt mit #ifdef __cpluplus . Dies stellt sicher, dass ein C ++ - Compiler weiß, dass diese Funktionen als C-Funktionen
  • exportiert werden
  • Wenn Sie sie verwenden, lassen Sie C99-Features niemals vom C ++ - Compiler gesehen werden. Einige dieser Features werden niemals von einem C ++ - Compiler unterstützt. Tatsache ist, dass einige große Compiler C99 nicht einmal für ihre C-Compiler unterstützen (siehe Ссылка )
  • Vermeiden Sie die Verwendung von C ++ - Schlüsselwörtern, oder lassen Sie den C ++ - Compiler sie nicht sehen (d. h. das Exportieren einer Funktion namens namespace oder class oder template ist eine schlechte Idee)

Damit Ihr C ++ - Code mit dem C-Code anderer kompatibel ist:

  • bietet alternative Header und Funktionen, die C ++ - Klassen und -Funktionen umschließen. Bestrafen Sie die C ++ - Leute nicht, indem Sie Klassen usw. entfernen, nur weil Sie mit C kompatibel bleiben wollen, aber stellen Sie andererseits sicher, dass die C-Leute angemessenen Zugriff auf Ihre Bibliothek haben, ohne zu einem C ++ - Compiler zu wechseln / li>
  • In den Headern, die für die C-Leute geschrieben wurden, dekorieren Sie Ihre Funktionsdeklarationen mit einem extern "C" -Spezifizierer, umhüllt mit #ifdef __cpluplus . Dies stellt sicher, dass ein C ++ - Compiler weiß, dass diese Funktionen als C-Funktionen
  • exportiert werden sollen

Zusätzliche Informationen

Ich fand die folgende Seite ziemlich interessant, da sie die Unterschiede zwischen C (einschließlich C99) und C ++ auflistet:

Ссылка

Wie für C99 Funktionen fehlen in C ++, können Sie meine Antworten Sie auf die Frage Was kann in c getan werden, aber nicht in C ++? : Ich beschreibe C ++ - Funktionen, die diese C99-Features leicht ersetzen.

Nachher

Wie auch immer, wenn C ++ schnell und robust genug für F-35 , dann sollte es für dich genug sein.

  

Ein großer Teil der Software des F-35 ist in C und C ++ geschrieben, weil Programmierer frei sind; Ada83-Code wird auch von der F-22 wiederverwendet.

     

Quelle: Wikipedia: Ссылка

Also, wenn Sie wählen müssen, dann wählen Sie Ihre Sprache, weil Sie es mögen, oder weil man als etwas, was das andere nicht hat. Aber nicht wegen angeblicher Leistungsunterschiede.

    
paercebal 05.09.2010 15:31
quelle
0

Ich denke, dass es einen kleinen Unterschied geben kann, aber oft ist der Algorithmus in Programmen der Ort, an dem Sie sich am meisten anstrengen sollten. Ob Sie nun C oder C ++ verwenden, spielt unter dem Gesichtspunkt der Leistung keine Rolle. C ++ ermöglicht es Ihnen, Ihr Modell einfacher (*) zu abstrahieren und ein benutzerfreundlicheres Framework zu erstellen. Selbst wenn es einen Unterschied gäbe, würde ich mir darüber nicht allzu viele Gedanken machen.

(*), d. h. besser von der Sprache selbst unterstützt.

    
Anders K. 05.09.2010 13:18
quelle
0

Mischen Sie niemals diese zwei Sprachen, sie sind sehr unterschiedlich. Selbst bei der Programmierung in "C" -Stil können Sie versehentlich große Fehler machen, indem Sie C ++ - Konstrukte verwenden.

Für C-Software verwenden Sie einen guten C-Compiler, der C99 wie gcc oder Intel unterstützt. Verwenden Sie für C ++ einen guten C ++ - Compiler, der die Aufgabe erfüllt. Das Mischen würde zu einem schlechten und gefährlichen Code führen.

Beispiel?

Sie sehen, dass der Code in der Datei ".cpp" ist und beginnen Sie mit einer einfachen Sache wie std::vector , die Ausnahmen auslöst (zum Beispiel std::vector::at ... Ausnahmen in C-Code wäre ein Desaster.

    
Artyom 05.09.2010 13:20
quelle

Tags und Links