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?
Einige Gedanken (und diese Frage sollte ein Community-Wiki sein)
static
functions, wo Sie sonst private
methods verwenden würden. 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. 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.
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.
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).
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.
Tags und Links c