Wie strukturierst du dein c-Programm?

8

Ich arbeite seit einigen Jahren in C # / Java, also machen mir die Grundlagen und ich nicht so viel zu schaffen. Aber ich habe nie etwas Größeres gemacht als kleine Kommandozeilen-Lernprogramme in C.

Ich versuche jetzt, einen Handy-Emulator für Linux zu entwickeln, und ich habe keine Ahnung, wie ich meinen Code strukturieren soll, wenn er nicht objektorientiert ist. Ich habe 3 große Bücher, die c im Detail behandeln, aber keiner von ihnen behandelt, wie man für die Wartbarkeit in einem größeren Projekt codiert.

Ich hatte also gehofft, dass einige von Ihnen, die erfahrener sind, mich auf eine Best Practice oder Ähnliches hinweisen könnten?

    
Bernt 13.10.2009, 15:58
quelle

7 Antworten

7

Einige Gedanken (und diese Frage sollte ein Community-Wiki sein)

  • Auch wenn es keine vollwertige objektorientierte Programmierung ist, versuchen Sie, bei den Methoden zum Ausblenden von Informationen zu bleiben. Lassen Sie Ihre Funktionen Zeiger oder Handles auf undurchsichtige Strukturen zurückgeben (die Unix-Datei handle api ist ein gutes (früheres) Beispiel. Verwenden Sie static functions, wo Sie sonst private methods verwenden würden.
  • Versuchen Sie, die zugehörige Funktionalität in einer einzigen Datei zu halten. Dies macht es einfacher, das oben genannte Schlüsselwort static zu verwenden und gibt Ihnen einen guten Hinweis, wenn es Zeit ist, einige Funktionen in eine separate Datei zu zerlegen. Für einen Java-Programmierer sollte dies keine allzu seltsame Übung sein.
  • Die Standardmethoden zum Kommentieren gelten. Verwenden Sie so etwas wie Doxygen , wenn Sie etwas Ähnliches wie javadoc / C # XML-Kommentare suchen.
  • Wenn Sie wirklich eine Zeit lang nichts ernstes in C getan haben, werden Sie sich mit Praktiken auseinandersetzen, um Ihr Speichermanagement sauber und vernünftig zu halten, auch wenn es nicht schwer ist viel mehr schmerzen, als Praktiken für die Wartbarkeit zu etablieren. Nur eine Warnung.
Michiel Buddingh 13.10.2009, 16:11
quelle
2

strukturieren Sie es im Allgemeinen auf die gleiche Weise. Trennen Sie die Dinge in mehrere Dateien, die jeweils Code enthalten, der damit zusammenarbeitet.

Oft mit C können Sie immer noch an Objekte denken. Aber statt Klassen mit Methoden sind es Strukturen und Funktionen, die auf einer Struktur operieren.

    
Evan Teran 13.10.2009 16:12
quelle
2

Ich würde empfehlen, Ihr Projekt in kleinere Komponenten aufzuteilen und jede Komponente in eine eigene .c- und .h-Datei zu stellen. Sie platzieren den Code in der .c-Datei und die Strukturen und Prototypen in der .h-Datei.

Damit können Sie objektorientiert in C programmieren, wenn Sie Ihre Funktionen reentrant behalten: Sagen Sie ein paar Funktionen, führen Sie eine Funktion FOO aus und deklarieren Sie dann, anstatt globale Variablen in foo.c zu haben eine Struktur mit dem Namen FOO in foo.h und die Funktionen nehmen einen Zeiger auf eine FOO Struktur als ihren ersten Parameter.

Wenn eine Funktion fred() nur irgendwo in foo.c verwendet wird, markieren Sie sie als static und setzen Sie den Prototyp nicht in foo.h

Suchen Sie auch nach Google-Codesearch für C-Projekte, um zu sehen, wie es gemacht wird.

    
Wernsey 13.10.2009 16:18
quelle
1

Nur weil es C ist, heißt das nicht, dass es nicht objektorientiert ist. Siehe diese Frage oder eine beliebige Anzahl von Fragen, die mit einigen Abweichungen benannt werden von "Learning C kommt aus objektorientierten Hintergrund."

Techniken wie diese werden heute noch verwendet - GIMP baut auf GTK + auf, das die GObject Bibliothek für objektorientiertes Codieren in C. Es ist möglicherweise nicht der beste Weg, und möglicherweise nicht "idiomatisch" C, aber es kann Ihnen helfen .

Der andere Rat, den ich habe, um die Wartbarkeit in einem großen Projekt zu codieren, ist Bibliotheken verwenden. C hat nicht viel eingebaut, so dass Sie mehr Funktionalität aus einem tragbaren System herausholen können ( Open Source?) Third-Party-Bibliothek, desto weniger Code you muss schreiben (und daher pflegen).

GTK + hat wieder GLib , eine Catch-All-Bibliothek mit vielen Funktionen, die die Leute selbst implementieren und in C reimplementiert. Apache hat seine eigene, die Apache Portable Runtime , die etwas sehr ähnliches (aber mit verschiedenen Arten von Funktionen) tut. Es gibt auch einige String-Bibliotheken, die Ihnen wahrscheinlich Kopfschmerzen ersparen werden, und einige Spezialbibliotheken (Readline für interaktive Eingabeaufforderungen, Ncurses für Textschnittstellen wie vi usw.), die nützlich sind, aber möglicherweise keine große Rolle spielen Ihre spezielle Anwendung.

Die besten Entscheidungen hängen zu einem gewissen Grad von dem ab, was Sie schreiben. Wenn Sie einen Betriebssystemkernel oder einen Gerätetreiber oder eine Anwendung für eingebettete Systeme schreiben, ignorieren Sie alle oben genannten Ratschläge. Wenn Sie eine Programmiersprache implementieren möchten, schauen Sie in flex und bison nach, um mit den Grammatiken einiger weniger zu beginnen Testen Sie Projekte, aber ich empfehle Ihnen, Ihren eigenen Parser und Lexer für ein seriöses Projekt zu verwenden (aus keinem anderen Grund als der verbesserten Fehlerberichterstattung).

    
Chris Lutz 13.10.2009 16:15
quelle
0

Ein paar Vorschläge ...

• Nutze den static Modifikator so oft du kannst; es ist (meistens) das Äquivalent von private in OO-Sprachen.

• Versuchen Sie, nicht zu viele globale Variablen zu verwenden, besonders wenn Ihr Programm mehrere Threads verwendet.

• Gruppenbezogene Informationen zusammen in structs ; Das sind deine Objekte in C.

• C hat keine Ausnahmebehandlung. Überprüfen Sie daher die Rückgabewerte aller Systemfunktionen, die Sie aufrufen.

    
David R Tribble 13.10.2009 20:42
quelle
-1

OO ist nur syntaktischer Zucker. Die ursprünglichen C ++ - Compiler nach C kompiliert. Hier ist ein grundlegendes Beispiel für ungefähr die gleiche Klasse in Java und in C:

%Vor%     
Imagist 13.10.2009 16:44
quelle

Tags und Links