Ressourcen zum Erlernen des C-Programmdesigns [closed]

Lesezeit: 8 Minuten

Benutzeravatar von KM
KM

Ich komme aus einem OO-Hintergrund (C#/Java) und suche nach Ressourcen, um zu lernen, wie man reine C-Programme gut entwirft.

Während ich mit der Syntax von C vertraut bin und kleine Programme schreiben kann, bin ich mir nicht sicher, wie ich bei größeren Anwendungen vorgehen soll und welche Techniken ich anwenden soll. Alles was ihr empfehlen könnt.

EDIT: Ich bin glücklich, OO für die Zwecke der Programmierung in C vollständig aufzugeben, mein Interesse ist es zu lernen, wie man ein Programm ohne OO strukturiert, ich möchte etwas über gute Möglichkeiten zum Entwerfen von Programmen in prozeduralen Sprachen wie C lernen.

  • Das Erlernen von C ist wahrscheinlich eines der besten Dinge, die Sie tun können, um Ihre Fähigkeiten wirklich zu erweitern. Ich weiß, das ist wahrscheinlich nicht das, was viele “moderne” Programmierer heutzutage zu hören gewohnt sind, aber es ist wahr. Ich denke, Ihr Wunsch, es zu lernen, ist ein wirklich kluger Schachzug.

    – Dan Formen

    29. Mai 2009 um 19:06 Uhr

  • Tolle Frage, ich bin in der gleichen Situation. C selbst ist ziemlich klein, aber wenn ich größere Anwendungen schreibe, weiß ich auch nicht, wie ich sie entwerfen soll …

    – Sander Versluys

    3. Januar 2011 um 10:28 Uhr

Dieser Beitrag enthält eine Liste von UNIX-Büchern, die die meisten klassischen C/Unix-Werke enthält. Für die C-Programmierung unter Windows ist Petzolds Programming Windows wahrscheinlich der beste Einstieg.

Für das Design von C-Programmen werden Ihnen einige der UNIX-Programmierbücher Schnipsel mitteilen, aber mir ist kein Buch über die Architektur von C-Programmen bekannt.

Wenn Sie an Java gewöhnt sind, hier einige Tipps für die C-Programmierung:

  1. Nutzen von Stapel. Wenn Sie eine Prozedur aufrufen, möchten Sie häufig Variablen im Stapelrahmen des Aufrufers zuordnen und Zeiger auf sie an die aufzurufende Prozedur übergeben. Dies ist wesentlich schneller als das dynamische Zuweisen von Speicher mit malloc() und deutlich weniger fehleranfällig. Tun Sie dies, wo immer es angebracht ist.

  2. C geht nicht Müllabfuhr, Das dynamische Zuordnen von Datenelementen ist also umständlicher und Sie müssen sie im Auge behalten sorge dafür, dass sie befreit werden. Auf dem Stapel zugewiesene Variablen (siehe 1) sind eher „idiomatisch“, wo sie anwendbar sind. Außerdem müssen Sie sie nicht freigeben – dies ist ein Bonus für lokale Variablen.

  3. Betrachten Sie in Bezug auf (2) eine Architektur, bei der Ihre Funktionen einen Status- oder Fehlercode zurückgeben und Daten mithilfe des Stapels gemäß (1) ein- und ausgeben.

  4. Erfahren Sie was setjmp() und longjmp() tun. Sie können für generische Fehlerbehandlungsmechanismen anstelle von strukturierten Ausnahmebehandlungsfunktionen sehr nützlich sein.

  5. C unterstützt keine Ausnahmen. Siehe (3).

  6. Fussel ist dein Freund. Schiene ist noch freundlicher.

  7. Erfahren Sie, was die Präprozessor tut und was Sie damit nicht tun sollten, selbst wenn Sie können.

  8. Lernen Sie die Ins und Outs von Endian-ness, Wortausrichtung, Zeigerarithmetik und andere architektonische Arcana auf niedriger Ebene. Entgegen der landläufigen Meinung sind dies keine Raketenwissenschaften. Wenn Sie Lust darauf haben, versuchen Sie, sich in Assemblersprache zu versuchen, und machen Sie sich damit vertraut. Es wird viel dazu beitragen, dass Sie verstehen, was in Ihrem C-Programm vor sich geht.

  9. C hat kein Konzept des Modulumfangs, also planen Sie Ihre Verwendung von Includes, Prototyp-Deklarationen und der Verwendung von extern und static um private Bereiche zu erstellen und Bezeichner zu importieren.

  10. GUI-Programmierung in C ist mühsam alle Plattformen.

  11. Apropos (10) lernen Sie die C-API von mindestens einer Skriptsprache wie z Tkl, Lua oder Python. In vielen Fällen ist die beste Verwendung von C als Kern-Hochleistungs-Engine für eine Anwendung, die im Wesentlichen in etwas anderem geschrieben ist.

  12. Das Äquivalent eines Konstruktors ist eine Initialisierungsfunktion, bei der Sie einen Zeiger auf das Element übergeben, das Sie einrichten möchten. Oft können Sie dies in Form eines Aufrufs der Funktion sehen, die wie folgt aussieht setup_foo(&my_foo). Es ist besser, die Zuweisung von der Initialisierung zu trennen, da Sie diese Funktion verwenden können, um ein Element zu initialisieren, das Sie auf dem Stapel zugewiesen haben. Ein ähnliches Prinzip gilt für Destruktoren.

  13. Die meisten Leute finden Ungarische Notation etwa so lesbar wie geschriebenes Ungarisch. Die Ausnahme hiervon sind ungarische Muttersprachler, die die ungarische Notation normalerweise so gut lesbar finden wie Keilschrift.. Leider ist die ungarische Notation in Windows-Software weit verbreitet und wird von der gesamten Win32-API verwendet, mit den erwarteten Auswirkungen auf die Lesbarkeit von Software, die auf dieser Plattform geschrieben wurde.

  14. C/Unix-Bücher, sogar wirklich gute, wie die von dem verstorbenen W. Richard Stevens, sind in der Regel recht günstig über den Amazon-Marktplatz aus zweiter Hand erhältlich. Besorgen Sie sich in keiner bestimmten Reihenfolge eine Kopie von K&R, Stevens APUE und UNP 1 & 2, das Drachenbuch, Rochkind, Programmierperlen, Petzold und Richter (wenn Sie unter Windows arbeiten) und alle anderen klassischen C/Unix-Arbeiten. Lesen Sie, kritzeln Sie mit einem Bleistift darauf und interagieren Sie im Allgemeinen mit den Büchern.

  15. Es gibt viele, viele gute C/Unix-Programmierung Ressourcen im Web.

  16. Lesen und verstehen Sie die Zehn Gebote der C-Programmierung und einige der Metadiskussionen über das Warum und Wozu hinter den Geboten. Dies ist bis zu einem gewissen Grad in die Jahre gekommen, obwohl das meiste davon immer noch relevant ist und obskure Compiler in der Welt der eingebetteten Systeme immer noch weit verbreitet sind.

  17. Lex und Yacc sind dein Freund, wenn du Parser schreiben willst.

  18. Wie Navicore unten betont (+1), Hanson’s ‘C-Schnittstellen und -Implementierungen’ ist ein Überblick über Schnittstellen-/Implementierungsdesign für modulare Architektur mit einer Reihe von Beispielen. Ich habe tatsächlich von diesem Buch gehört und Gutes darüber gehört, obwohl ich nicht behaupten kann, es gelesen zu haben. Abgesehen von den C-Idiomen, die ich oben beschrieben habe, ist dieses Konzept wohl der Kern eines guten prozeduralen Designs. Tatsächlich machen andere prozedurale Sprachen wie Modula-2 dieses Konzept in ihrem Design explizit. Dies könnte einem gedruckten Buch über die Architektur von C-Programmen am nächsten kommen.

  19. Lies das C-Häufig gestellte Fragen.

  • Dies sind definitiv einige gute Punkte. Ich bin überrascht, dass setjmp und longjmp so prominent erwähnt werden. Obwohl sie mächtig sind, sollte die Verwendung dieser beiden ziemlich selten sein, oder? Wenn Sie denken, dass der Missbrauch von goto schlecht ist (die meisten Leute scheinen das zu tun), stellen Sie sich den Missbrauch von setjmp und longjmp vor (Huch!). Was die Assemblierung betrifft, möchte ich hinzufügen, dass es wichtig ist, sich nicht nur mit dem Schreiben Ihrer eigenen Assembly zu beschäftigen, sondern auch die vom C-Compiler generierte Assembly zu analysieren, um zu verstehen, was wirklich vor sich geht.

    – Dan Formen

    29. Mai 2009 um 19:03 Uhr

  • Setjmp macht etwas mehr als goto. Es verdrängt den lokalen Kontext der Funktion. Sie würden es normalerweise verwenden, um anstelle eines strukturierten Ausnahmemechanismus generische Fehlerbehandlungsroutinen zu erstellen. Der Rat ist, zu verstehen, wie dieser Mechanismus funktioniert.

    – ConcernedOfTunbridgeWells

    30. Mai 2009 um 10:22 Uhr

  • In C gibt es keine Ausnahmen wie in Java, und es ist richtig, goto zu verwenden, um etwas Ähnliches zu implementieren.

    – hlovdal

    30. Mai 2009 um 21:57 Uhr

Meine Bedenken, von OO zurück zu C zu gehen, wurden in David Hansons “C Interfaces and Implementations” angesprochen.

C-Schnittstellen und Implementierungen

Im Ernst, sein Ansatz machte einen großen Unterschied, indem er verhinderte, versehentlich den großen Wollknäuel zu bauen, als den viele Nicht-oo-Systeme enden.

  • +1 – Danke, dass du mich daran erinnerst. Ich habe von diesem Buch gehört, aber ich habe es nie gelesen. Schnittstellen/Implementierungen sind eine zentrale prozedurale Methodik und werden in Modula-2 explizit gemacht. Ich werde in meinem Beitrag darauf hinweisen, da ich denke, dass dies einem Buch über C-Architektur am nächsten kommt, von dem ich je gehört habe. Gutes Denken 99 😉

    – ConcernedOfTunbridgeWells

    1. Juni 2009 um 9:07 Uhr

Benutzeravatar von Kieveli
Kieveli

Hier sind einige interessante Antworten auf eine andere Frage zur OO-Programmierung in C. Ich habe einen Beitrag über einen C-Code erstellt, mit dem ich gearbeitet habe und der im Grunde die Objektorientierung implementiert hat, die nur kurz angehalten wurde, indem virtuelle Methoden nicht einbezogen wurden.

Wenn ich C-Codierung machen würde, würde ich diese Technik verwenden, um “Objekte” zu definieren.

Ich finde es immer hilfreich, Design Patterns im Hinterkopf zu behalten, und sie können in den meisten Sprachen implementiert werden.

Hier ist eine schöne PDF-Diskussion Objektorientierte C-Programmierung.

  • Wenn Sie OO in C machen wollen, sollten Sie wirklich C++ verwenden. Wenn Sie C verwenden möchten, sollten Sie schönen, klaren prozeduralen Code schreiben.

    – Chris Lutz

    29. Mai 2009 um 12:47 Uhr

  • “Wer C verwenden will, sollte netten, klaren Verfahrenscode schreiben.” Können Sie Ressourcen empfehlen, um zu lernen, wie das geht? So etwas suche ich.

    – KM

    29. Mai 2009 um 13:31 Uhr

  • Es gibt Fälle, in denen die Verwendung von C erforderlich ist. Nicht alle Prozessoren verfügen über C++-Compiler – insbesondere, wenn Sie in eine Embedded-Situation wechseln. Wenn Sie mit Code arbeiten, der auf Low-Level-Hardware ausgeführt werden soll, ist es immer noch in Ihrem besten Interesse, ihn in C zu codieren und dann einen C++-Wrapper zu haben.

    – Kieveli

    29. Mai 2009 um 13:37 Uhr

  • OOP in C läuft hauptsächlich darauf hinaus, Objekte als Strukturen und Methoden als eigenständige Funktionen mit einem expliziten Instanzzeigerparameter zu implementieren. Dies ist ähnlich wie andere Sprachen OOP angehen, sodass Sie METHOD(object, arg1, arg2 …) aufrufen. Natürlich könnten Sie mit Funktionszeigern auch den gebräuchlicheren obj.method(arg1,arg2)-Ansatz implementieren.

    – keiner

    29. Mai 2009 um 20:15 Uhr

  • Wenn Sie die Verwendung von Funktionszeigern überspringen und die Methode zum Übergeben des Objektstrukturzeigers verwenden, bleibt der Code viel lesbarer =)

    – Kieveli

    1. Juni 2009 um 11:42 Uhr

Während es als etwas sprachagnostischer Text geschrieben ist, Code abgeschlossen bietet viele gute Anleitungen zur Codestruktur und -organisation sowie zu Konstruktionspraktiken.

1411740cookie-checkRessourcen zum Erlernen des C-Programmdesigns [closed]

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy