Die Art und Weise, wie ich meine C-Quelle immer organisiert habe, bestand darin, Struct-, Macro- und Funktionsprototypen in Headerdateien und Funktionsimplementierungen in .c-Dateien zu speichern. Jedoch habe ich vor kurzem viel Code anderer Leute für große Projekte gelesen und ich fange an zu sehen, dass Leute Sachen wie Strukturen und Makros in der C-Quelle selbst, direkt über den Funktionen, die davon Gebrauch machen, oft definieren. Ich kann einen Vorteil darin sehen, wie Sie nicht herumgehen müssen, um die Definition von Strukturen und Makros zu finden, die von bestimmten Funktionen verwendet werden, alles ist dort ungefähr an der gleichen Stelle wie die Funktionen, die es verwenden. Jedoch kann ich auch einige Nachteile sehen, da es bedeutet, dass es kein zentrales Repository für Struktur- / Makrodefinitionen gibt, da diese durch den Quellcode verstreut sind.
Meine Frage ist, was sind einige gute Faustregeln für die Entscheidung, wann die Makro / Struct-Definition in den C-Quellcode im Gegensatz zu den Header-Dateien selbst zu setzen?
Normalerweise ist alles, was Sie in die Header-Datei schreiben, Teil der -Schnittstelle , während alles, was Sie in die Quelldatei einfügen, Teil der Implementierung ist.
Das heißt, wenn etwas in der Header-Datei immer nur von der zugehörigen Quelldatei verwendet wird, ist es ein ausgezeichneter Kandidat zum Verschieben in diese Quelldatei. Dadurch wird verhindert, dass der Namespace jeder Datei, die Ihre Kopfzeile verwendet, mit Makros und Typen "verschmutzt" wird, die sie nie verwenden sollten.
Schnittstellen und Implementierungen ist das, worum es geht.
Zusatz zur angenommenen Antwort: Es kann nützlich sein, eine unvollständige Strukturdeklaration in den Header zu schreiben, aber die Definition nur in die .c-Datei zu schreiben. Ein Zeiger auf diese Struktur gibt Ihnen nun einen privaten -Typ, über den Sie die vollständige Kontrolle haben. Sehr nützlich, um die Trennung von Bedenken zu gewährleisten; ein bisschen wie private Mitglieder in C ++.
Für ausführliche Beispiele folgen Sie dem Link.
Fügen Sie Ihre öffentlichen Strukturen und Schnittstellen in die .h-Datei ein.
Legen Sie Ihre privaten Bits in die .c-Datei.
Wenn ich mehr als eine .c-Datei habe, die eine logische Funktionalität implementiert, lege ich die Dinge, die von diesen Implementierungsdateien geteilt werden müssen, in eine *p.h
-Datei ('p' für private). Der Client-Code sollte den * p.h-Header nicht enthalten.
Wenn ich zum Beispiel einen Satz von Routinen habe, die einen XML-Parser implementieren, könnte ich die folgende Organisation haben:
%Vor%Viele Leute kennen dieses grundlegende Zeugs BTW nicht, das benötigt wird, um bei jedem C-Projekt Ihre Vernunft zu bewahren.
Hauptsächlich handelt es sich um eine Art Kapselungsüberlegung. Sie können sich die Header-Datei eines Moduls nicht so sehr als "Overhead" vorstellen, was Sie anscheinend gerade tun, wie die öffentliche Schnittstellendeklaration, bei der es sich vermutlich um die Leute handelt, deren Code Sie sehen.
Von dort folgt natürlich, dass das, was in der Header-Datei geht, Dinge ist, über die andere Module wissen müssen: Prototypen für Funktionen, die Sie extern verwenden, Strukturen und Makros, die für Schnittstellenzwecke verwendet werden, externe Variablendeklarationen und so weiter, während Dinge, die ausschließlich für den internen Gebrauch des Moduls bestimmt sind, in die Datei .c
gehen.
Im Buch "C style: Standards and Guidelines" von David Straker (online verfügbar hier ) gibt es einige gute Ideen Datei-Layout und auf die Trennung zwischen C-Datei und Kopfzeilen.
Sie können das Kapitel 7 und speziell Kapitel 7.4.
lesenUnd wie John Calsbeek sagte, können Sie Ihre Organisation darauf ausrichten, wie die Header-Teile verwendet werden. Wenn eine Struktur, Typ, Makro, ... nur von einer Quelle verwendet wird, können Sie Ihren Code dorthin verschieben.
Sie können Header-Dateien für die Prototypen und einige Header-Dateien für die gemeinsamen Deklarationen (Typdefinitionen usw.) haben
Wenn Sie Ihre Strukturen und Makros innerhalb der .c definieren, können Sie sie nicht aus anderen .c-Dateien verwenden
Um dies zu tun, müssen Sie es in die .h-Datei einfügen, damit #include dem Compiler sagt, wo Sie nach Ihren Strukturen und Makros suchen müssen
es sei denn, Sie # enthalten "x.c", was Sie nicht tun sollten =)
Tags und Links c