Wenn Sie C ++ verwenden, aber nicht die spezifischen Funktionen der Sprache verwenden, sollten Sie zu C wechseln.

16

In meiner Freizeit entwickle ich einen NES-Emulator als Hobby. Ich benutze C ++, weil es die Sprache ist, die ich am meisten benutze, die ich am meisten kenne und am meisten mag.

Aber jetzt, da ich einige Fortschritte im Projekt gemacht habe, stelle ich fest, dass ich fast keine spezifischen Funktionen von C ++ verwende und es in einfachem C hätte tun können und das gleiche Ergebnis erzielen können. Ich verwende keine Vorlagen, Überladen von Operatoren, Polymorphismus, Vererbung. Also, was würdest du sagen? soll ich in C ++ bleiben oder es in C umschreiben?

Ich werde das nicht tun, um an Leistung zu gewinnen, es könnte als Nebeneffekt auftreten, aber die Idee ist, warum ich C ++ verwenden soll, wenn ich es nicht brauche?

Die einzigen Funktionen von C ++, die ich verwende, sind Klassen zum Einkapseln von Daten und Methoden, aber das kann auch mit Strukturen und Funktionen geschehen. Ich verwende new und delete, kann aber auch malloc und free verwenden, und ich bin Verwenden der Vererbung nur für Rückrufe, was mit Zeigern auf Funktionen erreicht werden könnte.

Denken Sie daran, es ist ein Hobby-Projekt, ich habe keine Fristen, so dass die Overhead-Zeit und die Arbeit, die ein erneutes Schreiben erfordern würden, kein Problem sind und auch Spaß machen könnten. Die Frage ist also C oder C ++?

Petruza
quelle
3
Mir scheint, Sie haben sich bereits geantwortet: Warum C ++ verwenden, wenn Sie nur C brauchen? Es gibt viele Situationen, in denen C vollkommen in Ordnung ist.
Giorgio
3
@ Giorgio: Und alle verschwinden nach den ersten 60 Sekunden und Sie müssen Ihren Code warten.
DeadMG
7
I use C++ because is the language I use mostly, know mostly and like mostly.Und das ist die Antwort auf Ihre Frage. Sie sollten die Sprache nur während des Projekts wechseln, wenn es ein Problem gibt, das Ihre aktuelle Sprache nicht lösen kann. I don't use templates, operator overloading, polymorphism, inheritance.Es wäre viel wertvoller, die Konzepte zu lernen und zu verwenden, als zu C zu wechseln. Da dies ein Hobbyprojekt ist, warum nicht ein paar Dinge verwenden, die Sie vorher noch nicht verwendet haben? Sie könnten jederzeit ein anderes Projekt in C starten und die Sprache lernen, aber für Ihr aktuelles Projekt ist ein Wechsel nicht sinnvoll.
Yannis
4
Ich verwende nicht 100% einer Sprache in jedem Projekt, das ich schreibe. Sie kennen C ++ am besten. Vielleicht finden Sie gute Gründe, Funktionen zu verwenden, für die Sie zuvor noch keine Verwendung gefunden haben. Sie können die Behandlung von C ++ als viel sicherer C beginnen, sobald Sie die Standardbibliothek Sachen und Boost - Konstrukte beginnen möchten std::shared_ptr, std::unique_ptr, boost::scoped_ptr, std::vector, std::deque, std::map, etc. Für Callback - Funktionen, Blick in die Verwendung von functors, und in C ++ 11, Sie kann auch anfangen, Dinge wie Lambda-Funktionen zu verwenden.
wkl
3
@ Giorgio: Ja. Das Rollen der unendlich verknüpften Liste führt zwangsläufig zu unnötigen Fehlern.
DeadMG

Antworten:

40

Sie verwenden es jetzt nicht, aber das nächste Mal , wenn Sie ein Speicherleck oder ein Doppel löschen bekommen, werden Sie wieder kommen betteln std::vector<T>, std::unique_ptr<T, Del>und std::shared_ptr<T>, was diese Probleme fast trivialen easily- lösen kann. Das ist es, was mit jedem passiert, der C über C ++ verwendet, und die intelligenteren warten einfach nicht darauf, dass die Bugs auftauchen, bevor sie übergehen.

Code, der C ++ verwendet newund deletedirekt nicht wirklich dazu gehört, gehört zu dieser Art von Halbhaus, das wir als "C mit Klassen" bezeichnen. Das ist , wo die Sprache circa 1985 war Es ist nicht besonders ähnlich wie C ++, circa 2011. Aller Wahrscheinlichkeit nach , wo immer Sie C ++ gelernt einfach haben es nicht lehren sehr gut etwas , das leider eher Common- und mit einer besseren Ausbildung, Sie würden Nutzen Sie diese Funktionen.

Insbesondere, wie ich oben aufgeführt habe, sind die generischen Datenstrukturen von C ++ und die Klassen für die Ressourcenverwaltung einfach alles, was C zu bieten hat, grundlegend überlegen. Wenn Sie ein dynamisch zugewiesenes Array möchten, verwenden Sie std::vector<T>. Das ist ein ziemlich häufiger Anwendungsfall. Wenn Sie sie nicht verwenden, besteht für Ihren Code ein enormes Fehlerrisiko, insbesondere im Zusammenhang mit der Ressourcenverwaltung. C ++ kann die Sicherheit gewährleisten und den Code so wiederverwenden, dass C ihn niemals berühren kann.

Ich denke jedoch, dass Sie möglicherweise auch zu viel erwarten. Das Schreiben von Vorlagen und Überladungen von Operatoren ist für Bibliotheksbenutzer nicht üblich. Wenn Ihr Code verwendet std::vector<T>, müssen Sie keine Vorlage schreiben , um dies zu erreichen. Wenn Ihr Code verwendet std::string, zwingt Sie niemand, Ihre Operatoren zu überlasten. Sie müssen nur diese Dinge tun, um zu schreibenstd::vector<T> und std::string- aber Sie können sie trotzdem voll ausnutzen.

Polymorphismus / Vererbung hat auch nur einen bestimmten Anwendungsfall. Wenn Sie in Ihrem Code keine Vorlagen schreiben oder virtuelle Funktionen verwenden müssen, müssen Sie keine eigenen Vorlagen schreiben. In einigen Programmen oder Programmsegmenten müssen Sie keine eigenen Vorlagen schreiben.

Auch in C ist kein Leistungsgewinn gegenüber C ++ zu verzeichnen.

DeadMG
quelle
1
@Giorgio: make_sharedexistiert und Sie können eine einfache make_uniqueVorlage schreiben , die den gleichen Job macht. Es ist sicherer.
DeadMG
4
Gute Antwort. Nagel auf den Kopf. C ++ ist für diese kleinen Bibliotheken, die wir immer verwenden sollten, am wertvollsten.
Andres Jaan Tack
2
@ Giorgio: Es ist unsicher, da bei Aufrufen mehrerer solcher Argumente im Ausnahmefall ein Speicherverlust auftreten kann und dies make_sharedeffizienter ist. Nur werkseitige Funktionen bieten garantierte Ausnahmesicherheit.
DeadMG
6
@ tp1: WTF? Auf Englisch bitte.
DeadMG
2
@Lohoris Du brauchst kein Zitat für den gesunden Menschenverstand. Inwiefern sollte C performanter sein als C ++?
Chris sagt Reinstate Monica
7

Selbst wenn Sie keine C ++ - spezifischen Funktionen verwenden, wird ein C ++ - Compiler aufgrund des strengeren Typsystems von C ++ mehr Probleme als ein C ++ - Compiler haben.

Nemanja Trifunovic
quelle
6

Ich würde es aus der anderen Richtung betrachten. Wirst du etwas gewinnen , wenn du den Code in C umschreibst? Selbst bei einem rein hobbyistischen Projekt sind mit einem solchen Umschreiben Kosten verbunden. Wenn es sonst nichts gibt, was ich als Opportunitätskosten bezeichne, dh die anderen Dinge, die Sie in dieser Zeit hätten tun können, wenn Sie Ihre Zeit nicht damit verschwendet hätten , es in C umzuschreiben.

Fazit: Wenn Sie nicht der Meinung sind, dass der Code in einer Umgebung verwendet werden kann, in der der Zugriff auf C ++ sehr eingeschränkt (oder nicht vorhanden) ist, wäre dies im besten Fall eine sinnlose Zeitverschwendung. Zumindest in meiner Erfahrung, es geht in der Regel weit darüber hinaus sehr schnell - denken wieder über Code , den ich habe in C ++ geschrieben , die hatte bis C werden umgewandelt, kann ich ziemlich deutlich , dass auch nicht vergessen , in ganz wenigen Fällen , in denen es schien , wie Es sollte trivial sein, ich habe viel mehr C ++ -spezifische Funktionen verwendet, als ich ursprünglich gedacht hatte. Um die Hoffnung zu haben, überhaupt nützlich zu sein, müssten Sie C89 / 90 verwenden. In diesem Fall werden Sie schnell daran erinnert, dass Sie alle Variablen am Anfang eines Blocks definieren müssen, anstatt dort, wo sie sich tatsächlich befinden benutzt.

Kurz gesagt, wenn Sie nicht sicher sind, dass das Umschreiben in C einen echten Vorteil bietet, gibt es fast zwangsläufig viel bessere Dinge zu tun.

Jerry Sarg
quelle
+1 Vor einiger Zeit musste ich eine Bibliothek schreiben, um sie in einem anderen C-Projekt zu verwenden, und ich fand es eine gute Idee, sie auch in C zu implementieren, Mann, was für ein dummer Idiot ich damals war.
Chris sagt Reinstate Monica
1

Als allgemeinere Antwort:

Wechseln Sie nicht zu C ++, nur weil Sie einige der einzigartigeren Funktionen verwenden. Eines Tages benötigen Sie möglicherweise diese Funktionen und werden sich nur den Kopf zerbrechen, weil Sie C verwenden.

Dynamisch
quelle
1

Für die Hobbyentwicklung würde ich in Betracht ziehen, wieder auf C umzuschalten. C- und C-ähnliche Sprachen werden mit größerer Wahrscheinlichkeit von winzigen Hobbyentwicklungsmodulen unterstützt.

Viele der Antworten stammen möglicherweise von professionellen Softwaretypen. Als Bastler werden Sie nicht ständig oder ganztägig programmieren. Überlegen Sie sich also, an welche Sprache Sie sich mit größerer Wahrscheinlichkeit erinnern oder die darin enthaltenen Macken vergessen, wenn Sie Ihr Projekt ein Jahr lang aufstellen und dann zurückkehren und versuchen, Ihren Code zu lesen, nachdem Sie beim Codieren verrostet sind. C ++ mit einem umfangreicheren Funktionsumfang kann je nach Codierungsstil mehr oder weniger Zeit in Anspruch nehmen.

hotpaw2
quelle
1

Es ist nicht einfach, Ihre Fragen zu beantworten, da wir nicht wissen, ob Sie an dem Projekt arbeiten, um Ihre sprachspezifischen Fähigkeiten (C vs C ++) oder andere Programmierfähigkeiten (Design, Problemlösung usw.) zu verbessern.

"Die einzigen Funktionen von C ++, die ich verwende, sind Klassen zum Einkapseln von Daten und Methoden, aber das kann auch mit Strukturen und Funktionen geschehen." Das ist nicht wahr. structsin C unterstützen keine Kapselung und können keine Funktionen (Methoden) enthalten - zumindest nicht ohne Techniken wie Zeiger auf Funktionen. Außerdem sind Funktionen in C schwächer, weil sie nicht überladen werden können.

"Ich verwende new und delete, könnte aber auch malloc und free verwenden, und ich verwende die Vererbung nur für Rückrufe, was mit Zeigern auf Funktionen erreicht werden könnte." Wie bereits erwähnt, wird die Verwendung von direkt newund deletein C ++ nicht empfohlen . Außerdem sollte die IMHO- (und die GoF-) Vererbung in OOP nur dann der Komposition vorgezogen werden, wenn Polymorphismus erforderlich ist. Und ich denke nicht, dass es trivial ist, Polymorphismus (späte Bindung) in C mit Zeigern auf Funktionen zu erreichen.

Abgesehen davon werde ich nicht versuchen, Sie davon zu überzeugen, dass C ++ "besser" ist als C, da dies eine Frage der Präferenz ist und immer von dem Problem abhängt, das Sie zu lösen versuchen (die Verwendung von OOP-Funktionen für die Entwicklung Ihres NES-Emulators könnte hilfreich sein) eine gute Idee).

Sakisk
quelle
1
structsin C kann in der Tat verwendet werden, um Methoden zu kapseln. Sie erstellen einfach eine Struktur von Funktionszeigern und initialisieren sie so, dass sie auf die gewünschten Funktionen verweisen. Werfen Sie einen Blick auf lxr.linux.no/linux+v3.3/include/linux/fs.h#L1598 für ein Beispiel.
Robert Martin
Das ist richtig. Danke für den Kommentar, ich habe die Antwort erweitert.
Sakisk
Nett. Noch eine kleine Sache: Funktionen in C können überladen werden (think printf), aber dabei verlieren Sie jegliche Typprüfung. Es gibt keine Möglichkeit, eine endliche Menge akzeptabler Deklarationen zu haben: entweder 1 (und Sie erhalten eine Typprüfung) oder "viele" (und verlieren alle Typprüfungen, unter großem persönlichem Risiko). Wie bei den meisten Dingen in C ist es möglich, aber oft unangenehm.
Robert Martin
Zeiger auf Funktionen sind eine fortgeschrittene C-Technik? "Ja wirklich?"
Donal Fellows
@DonalFellows Du hast recht, ich habe übertrieben. Entfernt erweiterte ... :)
Sakisk
0

Ich bin ein sehr Anfänger, also kommen hier meine 2 Bits.

Ich lerne C und C ++ bei Wibit.net mit einigen netten grundlegenden Videotutorials. Vielleicht können sie Ihnen sehr helfen, einen Überblick über die "Situation" zu gewinnen (keine Werbung!).

Ich rate Ihnen, zu C zu wechseln, nur um zu lernen, dass Sie ein Hobbyist sind. Dies wird ein Vergnügen sein, kein Problem.

Ich rate mehr. Mach es in beiden Sprachen. Vergleichen Sie die Art und Weise und die Lösungen, die Sie finden und verwenden. Ich bin mir sicher, dass es nicht so einfach wird, wie Sie es erwarten ... aber Sie werden sicher viel lernen!

H_7
quelle
1
Vielen Dank, aber ich lerne nicht, ich kenne C und C ++ bereits und frage, welches für dieses spezielle Projekt verwendet werden soll.
Petruza
Ups, meine Zeit zu lernen! = P
H_7
1
Außerdem würde ich raten, dass Sie anstelle von Video-Tutorials die Bücher von Kernigan und Stroustrup sowie eine schöne IDE (Visual Studio, Eclipse, Xcode) erhalten und durch Codierung der Beispiele, Versuch und Irrtum und Rückgriff auf Stackoverflow lernen.
Petruza
-1

Hier sind die Vor- und Nachteile von C ++ gegenüber C:

  1. Das Verschieben nach C würde es einfacher machen, innerhalb der ausgewählten C ++ - Teilmenge zu bleiben, da der Compiler dann einen Fehler auslöst, wenn Sie ihn verlassen. Wenn das Hauptproblem darin besteht, innerhalb der festgelegten Teilmenge zu bleiben, sollte diese Alternative gewählt werden. (Warum haben wir keine Compiler-Unterstützung dafür?)
  2. Sobald Sie innerhalb der ausgewählten c ++ - Feature-Untermenge bleiben können, versuchen Sie als Nächstes, die Untermenge zu ändern, um schlechte Konventionen zu beseitigen, die den Code verletzen. Dies erfordert die Verwendung von ganzem c ++.
  3. Sobald Sie sowohl "Bleiben in Teilmenge" als auch "Es ist eine gute Teilmenge" haben, verlassen Sie die c ++ - Funktionen und beginnen Sie, über die Anforderungen nachzudenken.
tp1
quelle