C ++ Projekt Quellcode-Layout
Frage
Eines der beliebtesten Wege Projektverzeichnis zu organisieren, ist mehr oder weniger wie folgt aus:
MyLib +--mylib_class_a.h mylib_class_a.cpp mylib_library_private_helpers.h mylib_library_private_helpers.cpp MyApp +--other_class.h other_class.cpp app.cpp
app.cpp
:
#include "other_class.h"
#include <mylib_class_a.h> // using library MyLib
Alle .h
und .cpp
Dateien für die gleiche Bibliothek sind im selben Verzeichnis. Um Namenskollision zu vermeiden, werden Präfix Dateinamen häufig mit Firmennamen und / oder Bibliotheksnamen. MyLib wird in MeineAnw Header-Suchpfad sein, etc. Ich bin kein Fan von prefixing Dateinamen, aber Ich mag die Idee des Blicks auf dem #include
und genau wissen, wo die Header-Datei gehört. Ich weiß nicht, diesen Ansatz hassen Dateien zu organisieren, aber ich denke, es sollte ein besserer Weg geben.
Da ich ein neues Projekt starten, möchte ich einige Verzeichnis Organisation Ideen werben. Ich mag zur Zeit diese Verzeichnisstruktur:
ProjA +--include +--ProjA +--mylib +--class_a.h +--app +--other_class.h +--src +--mylib +--class_a.cpp library_private_helpers.h library_private_helpers.cpp +--app +--other_class.cpp app.cpp util.h
app.cpp
:
#include "util.h" // private util.h file
#include <ProjA/app/other_class.h> // public header file
#include <ProjA/mylib/class_a.h> // using class_a.h of mylib
#include <other3rdptylib/class_a.h> // class_a.h of other3rdptylib, no name collision
#include <class_a.h> // not ProjA/mylib/class_a.h
#include <ProjA/mylib/library_private_helpers.h> // error can't find .h
.cpp
Dateien und private (nur sichtbar für sofortige Bibliothek) .h
Dateien werden unter dem src-Verzeichnis gespeichert (src wird manchmal lib genannt). Öffentliche Header-Dateien werden in ein Projekt / lib Verzeichnisstruktur organisiert und über <ProjectName/LibraryName/headerName.h>
enthalten. Die Dateinamen werden nicht mit irgendetwas vorangestellt. Wenn ich jemals wieder zu verpacken MyLib benötigt, um von anderen Teams verwendet werden, konnte ich einfach mein Make-Datei ändern Sie die entsprechenden Binärdateien und das Ganze zu kopieren include / proja Verzeichnis.
Sobald die Dateien in die Quellcodeverwaltung überprüft werden, und die Menschen beginnen an ihnen arbeiten wird es schwer sein Verzeichnisstruktur zu ändern. Es ist besser, es richtig zu machen bei der get-go.
Jeder mit Erfahrung Quellcode wie diese zu organisieren? Alles, was Sie nicht über es? Wenn Sie einen besseren Weg, es zu tun, würde ich sehr gerne davon hören.
Lösung
Nun, es hängt alles davon ab, wie groß diese Projekte sind. Wenn Sie nur ein paar Dateien haben, dann haut sie alle in einem Ordner.
Zu viele Ordner, wenn Sie nicht viele Dateien bekommen haben, ist übertrieben meiner Meinung nach zu verwalten. Es nervt graben in und aus Ordnern, wenn Sie haben nur ein paar Dateien in ihnen.
Auch hängt es davon ab, die dieses Zeug mit. Wenn Sie eine Bibliothek gerade schreiben und sein Gehen von anderen Programmierern verwendet wird, dann ist es gut, den Header sie in einen Ordner enthalten verwenden mag, zu organisieren. Wenn Sie eine Reihe von Bibliotheken sind das Erstellen und Veröffentlichen sie alle, dann könnte Ihre Struktur arbeiten. Aber, wenn sie unabhängige Bibliotheken sind, und die Entwicklung ist alles in allem nicht getan und sie bekommen versioniert und zu verschiedenen Zeiten veröffentlicht, dann würden Sie besser dran kleben sein mit alle Dateien für ein Projekt mit lokalisierbar innerhalb eines Ordners.
In der Tat, würde ich sagen, alles halten in einem Ordner, bis Sie zu einem Punkt, wo man seine unmanagable finden, dann reorganisiert in eine kluge Regelung von der Quelle bis in Ordner sortieren, wie Sie getan haben. Sie werden wahrscheinlich wissen, wie es von den Problemen organisiert werden muss man den Weg laufen.
KISS ist in der Regel immer die Lösung in der Programmierung -> alles so einfach wie möglich halten
.Andere Tipps
Warum nicht so etwas wie die ersten tun, verwenden Sie nur das Verzeichnis, das MyLib
als Teil der Richtlinie enthalten wohnt, die die dumme Vorfixierung reduziert:
#include <MyLib/ClassA.h>
Das sagen Sie, wo sie aus sind. Was die zweite Wahl, erhalte ich persönlich wirklich verärgert, wenn ich eine Kopf- oder Quelldatei geöffnet haben, und um durch die Verzeichnisstruktur navigieren müssen, um die andere, und öffnen Sie es zu finden. Mit Ihrem zweiten Beispiel, wenn Sie offen src/mylib/class_a.cpp
hatte, und wollte den Header, in vielen Editoren bearbeiten würden Sie wieder zwei Ebenen gehen, dann in include/ProjA
vor den Header zu finden. Und wie sollen wir wissen, dass der Header im ProjA
Unterverzeichnis ist ohne einig anderen externen Hinweis? Außerdem ist es zu einfach für eine Datei oder die andere in einen anderen Ort gebracht werden, dass „besser“ darstellt, wie es verwendet wird, ohne die alternative Datei verschoben werden. Es gibt nur Kopfschmerzen mich, wenn ich es in meinem Job begegnen (und wir haben einige Teile unserer Code-Basis haben, wo die Menschen jedes potentielle Problem habe ich gerade erwähnt habe).
Ich habe beiden Methoden ausprobiert. Ich persönlich mag die erste besser. Ich verstehe den Drang, alles in spezifischere Verzeichnissen zu setzen, aber es verursacht eine Menge über Komplikation.
ich in der Regel diese Regel verwenden: Anwendungen und in-house-Bibliotheken verwenden Sie die erste Methode. Öffentliche Open-Source-Bibliotheken verwenden die zweite Methode. Wenn Sie den Code veröffentlichen, es hilft viel, wenn die Include-Dateien in einem separaten Verzeichnis sind.