2010-02-23 14 views
8

Derzeit programmiere ich in Java und benutze Maven ziemlich oft. So habe ich mich an die Namensschemata und Ordnerstrukturen gewöhnt, die ich in den letzten 4 oder 5 Jahren benutzt habe.Wie layout ich mein C++ Programm? (Wo soll ich die .h und .cpp Dateien ablegen?)

Als ich vor kurzem begonnen habe, C++ zu lernen, merke ich, dass ich keine Ahnung habe, wo ich all meine Dateien ablegen soll. Soll ich alles nach Namespace oder nach welcher Stufe aufteilen? Wo würde ich zum Beispiel eine Reihe von Dateien für die Benutzeroberfläche aufbewahren, wie etwa Dateien, die dazu dienen, Daten zu speichern?

Gibt es irgendwelche Standards für diese Art von Sache?

Offensichtlich gibt es keine definitive Antwort auf diese Frage. Ich suche einfach einen guten Führer. Ich möchte nicht anfangen, C++ zu lernen, indem ich zu viel Zeit damit verbringe, mir Gedanken darüber zu machen, wie meine Dateien angelegt sind. Ich hätte lieber ein paar gute Modelle und komme einfach zum Codieren.

+0

Welche Art von Umgebung verwenden Sie? – ihtkwot

+0

Wo man eine Programmausgabe setzt, ist eine ganz andere Sache und wahrscheinlich besser als eine andere Frage gefragt. –

+0

@gf guter Punkt. redigiert es. – Stephano

Antwort

5

Das folgende ist ziemlich typisch ...

third-party library 
    release 
    obj 
    debug 
    obj 
    include 
    src 
    sublib 1 
    sublib 2 

mylibrary 
    release 
    obj 
    debug 
    obj 
    include 
    src 
    sublib 1 
    sublib 2 

myapp 
    release 
    obj 
    debug 
    obj 
    subapp 1 
    subapp 2 

mylittleapp 
    release 
    obj 
    debug 
    obj 

Grundsätzlich Unterordner für Teilprojekte gemeinsam für größere Projekte, sondern vor allem ein bestimmtes Projekt hat Ordner für src enthalten usw. Ein Ordner für jeden Build-Konfiguration üblich, und halten Sie die Obj-Dateien und andere Zwischenprodukte in einem Unterordner davon ist eine gute Idee. Es mag verlockend sein, Unterprojektordner in obj-Ordner zu platzieren, aber das ist normalerweise nicht nötig - die obj-Ordner müssen nicht gut organisiert sein, so dass nur ein Dateinamenskonflikt besteht und die beste Lösung darin besteht, eindeutige Quelldateinamen zu haben innerhalb (mindestens) jedes Projekts.

Die "include" Ordner sollten IMO nur Header enthalten, die von anderen Projekten eingeschlossen werden - interne Header gehören in den Ordner "src".

Das Einfügen von UI-Material in einen separaten Ordner ist keine schlechte Idee, wenn es groß genug ist. Ich habe UI-Sachen als separates, statisch verknüpftes Top-Level-Projekt gesehen, und ich meine hier app-spezifisch, nicht (z. B.) wxWidgets. Normalerweise ist diese Unterteilung jedoch Teilprojekt wenn es überhaupt wert ist, getrennt zu werden. Wie Sie Teilprojekte aufteilen, hängt eher von anwendungsspezifischen Blöcken ab, und hängt davon ab, ob UI-Elemente am besten als separater Block oder als separate Blöcke mit aufgabenspezifischer Logik behandelt werden.

Namespaces sind nicht die meistgenutzte Sprachfunktion, möglicherweise weil viele Leute "using" so oft verwenden, dass sie keinen großen Unterschied machen. Ein Namespace für ein Hauptbibliotheksprojekt ist sinnvoll, aber die Zuordnung von Unterordnern zu Namespaces 1: 1 habe ich nicht gesehen. Ich persönlich habe einen Namespace, der den größten Teil meines Bibliothekscodes umfasst, mit ein paar Sub-Namespaces für Dinge, die im Allgemeinen selten verwendet werden, aber an einigen Stellen sehr häufig verwendet werden (z. B. "bitweise" Namespaces). Die Sub-Namespaces sind auf Single-Source-/Header-Paare beschränkt, sodass keine Unterordner benötigt werden. Der Großteil der bibliotheksspezifischen Auswahl erfolgt durch Einfügen der richtigen Kopfzeile - mit der Ausnahme, dass ich das Los in der Regel sowieso über einen Hauptprojekt-Header der obersten Ebene einschließe.

Im Wesentlichen sind Namespaces eine Möglichkeit, Namenskonflikte zu vermeiden. Sie assoziieren nicht unbedingt mit Abstraktionen oder funktionalen Blöcken oder irgendetwas. In einem bestimmten Projekt ist es wahrscheinlich besser, wenn Sie sicherstellen, dass die Namen nicht in Konflikt stehen. Wie mit dem Namespace "std" ist es in Ordnung, einen Los von Zeug in einem Namespace zu setzen.

Wie Sie sagen, ist dies jedoch keine definitive Antwort - es gibt natürlich kleinere Variationen und ganz andere Ansätze.

1

Bei kleinen Projekten gruppiert mein Team alle Dateien zusammen durch eine Verknüpfungseinheit, dh Bibliothek, DLL, EXE. Wenn die Einheit sehr groß ist, werden wir die Dateien manchmal nach Funktionseinheit oder Subsystem aufteilen, so dass, wenn Sie eine Komponente bearbeiten müssen, sie sich im Allgemeinen an der gleichen Stelle befinden.

1

breche ich meine Projekte nach Themen, ein Verzeichnis für Thema:

menu_planner 
    src 
    recipes 
     debug -- contains debug object files and libraries 
     release -- contains release object files and libraries 
     obsolete -- contains obsolete source files 
    ingredients 
     debug -- contains debug object files and libraries 
     release -- contains release object files and libraries 
     obsolete -- contains obsolete source files 
    references 
     debug -- contains debug object files and libraries 
     release -- contains release object files and libraries 
     obsolete -- contains obsolete source files 
    meals 
     debug -- contains debug object files and libraries 
     release -- contains release object files and libraries 
     obsolete -- contains obsolete source files 
    menus 
     debug -- contains debug object files and libraries 
     release -- contains release object files and libraries 
     obsolete -- contains obsolete source files 
    docs 
    designs 

Meine Erfahrung mit C und C++ hat mir gezeigt, dass Header und Quelle Dateien im selben Verzeichnis sein sollten. Häufig ist es schwieriger, eine Header-Datei zu finden, wenn sie sich nicht im selben Verzeichnis wie die Quelldatei befindet.

Ein Verzeichnis (Ordner) pro Konzept ist eine gute Idee. Jedes Konzept, das komplex oder zusammengesetzt ist, sollte in mehrere Ordner oder Konzepte aufgeteilt werden.

Ich habe auch gelernt, Bibliotheken zu machen. Ich verwende Bibliotheken, um Code zu enthalten, der sich nicht viel ändert. Der Verknüpfungsschritt führt bei Bibliotheken schneller als bei Verzeichnissen von Objektdateien.

Jedoch können, Arbeitsplätze (a.k.a. Shops) verschiedene Stilregeln haben, die befolgt werden müssen.

0

Es ist nicht notwendig, Ihre Header-Dateien und cpp-Dateien im selben Ordner zu haben. Ich habe das schon oft gemacht. Sie können die Dateien in verschiedenen Ordnern speichern und eine andere Datei verwenden, um beide Dateien in der Datei abzurufen/einzuschließen, die Sie als Include verwenden. Besuchen Sie den folgenden Link, um ein besseres Verständnis dessen zu bekommen, was ich sage. Es zeigt Ihnen, wie Sie Ihre eigene Dateiorganisationsstruktur implementieren.

http://codednotes.blogspot.com/2014/01/organising-headers-and-source-files.html

Verwandte Themen