Ich habe ein Projekt mit folgender Verzeichnisstruktur.
%Vor% Also eine Datei sagen foo.cpp
in src/module1
muss enthalten wie,
Das sieht unordentlich und schwer zu schreiben aus. Ich fand Schreiben wie
%Vor% und Angabe des Include-Dateisuchpfads zu root/include
, wenn das Kompilieren ordentlich aussieht. Ich bin mir jedoch nicht sicher, ob dieser Stil irgendwelche Nachteile hat.
Welche bevorzugen Sie und warum? Siehst du auch Probleme beim Organisieren von Dateien auf die obige Weise?
Die Angabe von Pfaden sollte so weit wie möglich vermieden werden. Compiler bieten Ihnen eine sauberere Alternative, um dasselbe zu erreichen. Außerdem sollte ein sauberes Design dafür sorgen, dass Sie keine relativen Pfade für das Einfügen von Headern jonglieren müssen.
Eine bessere Idee, welche verwendet werden soll (einschließlich der Verwendung von Anführungszeichen oder spitzen Klammern) kann vom Standard erhalten werden.
Aus meiner Kopie des C ++ - Entwurfs:
%Vor%16.2 Quelldateieinbindung
2 Eine Richtlinie für die Vorverarbeitung des Formulars
%Vor%durchsucht eine Sequenz von implementierungsdefinierte Orte für a Header eindeutig durch die identifiziert angegebene Reihenfolge zwischen
<
und>
Trennzeichen und bewirkt die Ersetzung dieser Richtlinie insgesamt Inhalt des Headers. Wie die Orte angegeben oder der Header identifiziert ist implementierungsdefiniert.3 A Preprocessing-Direktive des Formulars
%Vor%bewirkt, dass das ersetzt wird Richtlinie durch den gesamten Inhalt von die Quelldatei, die von der spezifizierte Sequenz zwischen den Trennzeichen. Die benannte Quelldatei wird gesucht in einer implementierungsdefinierten Weise. Wenn diese Suche nicht unterstützt wird oder wenn Die Suche scheitert, die Direktive ist wieder aufbereitet, als ob es
gelesen hätte
mit der identischen enthaltenen Sequenz (einschließlich & gt; Zeichen, falls vorhanden) von die ursprüngliche Richtlinie.
7 Obwohl eine Implementierung einen Mechanismus zur Verfügung stellen kann beliebige Quelldateien verfügbar für die & lt; & gt; Suche, im Allgemeinen Programmierer sollte die & lt; & gt; Formular für Kopfzeilen mit der Implementierung bereitgestellt, und die "" Form für Quellen außerhalb der Kontrolle der Implementierung.
Ich unterstütze beide Stile ... für verschiedene Anwendungen
Nehmen wir an, Sie haben auch ein Verzeichnis root/src/common
für den Zweck meines Beispiels
Einschließen
Ich bevorzuge es, das "include" -Verzeichnis nicht zu sehen, da es natürlich schwieriger ist, die exakte Header-Datei zu finden ... aber wenn Sie beginnen und sich mehreren unabhängigen Bibliotheken zuwenden, müssen Sie abstrahieren, weil Sie wollen in der Lage sein, die verschiedenen Komponenten zu verschieben, ohne den Code zu ändern, und ich bin ganz auf Konsistenz.
Es besteht auch immer die Gefahr, dass '..' verwendet wird, weil es wegen einer rückwärtsgerückten symbolischen Verbindung nicht an die Stelle Ihrer Gedanken geht: /
Quelle
Manchmal gibt es Header, die nicht öffentlich sind und daher nicht im Verzeichnis include
. Dies sind normalerweise Implementierungsdetails, die für Ihre Kunden nicht relevant sind. Für die verwende ich die ..
wenn nötig und genau die genaue Position.
Dies ermöglicht:
- um die -I
nicht mit allen möglichen Verzeichnissen von src
zu überladen
- Finden Sie leicht die Datei unter Ihren Quellen
- Testen Sie leicht Abhängigkeiten zwischen Ihren Quellen (grep für ..
)
Verschiedenes
Wenn ich
eingeben muss %Vor%Dann erwarte ich:
%Vor%erleichtert die Zuordnung eines bestimmten Typs zu einem bestimmten Modul.
Die Anforderung einer Bibliothek - ein Namespace mit identischen Namen - erleichtert das Navigieren durch die ~ 300 oder ~ 400 Komponenten, die wir bei der Arbeit haben: Wir mussten eine Möglichkeit finden, sie zu organisieren!
Dies bedeutet zwar, dass Ihr ursprüngliches Layout als (für das module
-Projekt) überarbeitet wird:
Und Sie verwenden dann die folgende Anweisung: -I/path../root/include
Und ich erwarte, dass Sie entweder eine libmodule.so
Bibliothek oder eine module
Binärdatei erstellen.
Ich bevorzuge den 2. Weg
%Vor%Ich finde, es macht die Quelle viel einfacher zu betrachten. Das Problem ist, wenn andere Leute Ihren Code betrachten, ist es nicht unbedingt inhärent, wo sich die Header-Datei befindet, während die erste Art der Einbindung ist.
Als kleine Verfeinerung empfehle ich, dass cc
files in module1 direkt auf ihre .h
-Dateien zugreifen:
oder ähnlich. Dies erzeugt einen visuellen Effekt in Ihren c-Dateien, der fremde Includes vom Standard-Include unterscheidet:
%Vor%Google C ++ Style Guide hat einen Abschnitt zu diesem Thema, in dem die Bestellung und die Benennung besprochen werden von umfasst. Es stimmt grundsätzlich mit dem überein, was in den anderen Antworten bisher gesagt wurde, aber es lohnt sich, einen Blick darauf zu werfen, da es sehr spezifisch ist.
Ich bevorzuge (und Google stimmt zu), relative Pfade in den include-Direktiven nicht zu verwenden. Ihre anfängliche Einschätzung, dass es ordentlich aussieht, ist richtig. Lange, klobige, relative Pfade machen es schwerer lesbar und schwieriger zu refaktorieren. Ich denke deine Vorgehensweise ist korrekt.
Was die Trennung von Quell- und Include-Dateien in zwei verschiedene Unterbäume betrifft: Warum werden die Header nicht neben den Quelldateien gespeichert? Es macht es einfacher, sie zu vergleichen. Es sei denn, Sie erwarten, dass andere Projekte Ihre Header verwenden und nur auf Ihre Binärdateien verweisen & lt; Achselzucken / & gt;
Ich verwende keine Pfade in #include
Direktiven. Nach meiner Erfahrung verursachen sie immer Probleme in der Wartungsphase. Bei vielen Compilern können Sie den Suchbaum für Header-Dateien angeben.
Sie werden. Ihre Hierarchie wird sich ändern. Möglicherweise möchten Sie die Dateien auf einem anderen Laufwerk speichern. Sie können den Standort ändern, wenn ein anderer Benutzer Ihren Code ändert. Die Dateien können sich verschieben, wenn sie für ein anderes Projekt portiert werden. Es gibt nichts, was Ihre Dateien daran hindert, sich zu bewegen.
Wenn Sie wissen, dass Dateien verschoben werden, muss die Datei beim Verschieben geändert werden, wenn sich der Pfad in der Datei befindet. Ohne den Pfad in der Datei müssen nur die Build-Anweisungen geändert werden. Bei großen Projekten ist das Ändern vieler Dateien ein Problem (selbst bei Skripten).
Meiner Meinung nach sind Pfade in #include
Direktiven böse. Leute, die dies tun, sollten umgeschult oder an andere Firmen geschickt werden.
Tags und Links c++ header-files