Include Header-Dateien Stil - C ++

8

Ich habe ein Projekt mit folgender Verzeichnisstruktur.

%Vor%

Also eine Datei sagen foo.cpp in src/module1 muss enthalten wie,

%Vor%

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?

    
Navaneeth K N 28.01.2010, 17:01
quelle

7 Antworten

4
%Vor%

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:

  

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
%Vor%
  

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.

    
dirkgently 28.01.2010, 17:07
quelle
2

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

%Vor%

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:

%Vor%

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.

    
Matthieu M. 28.01.2010 17:29
quelle
1

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.

    
silent1mezzo 28.01.2010 17:04
quelle
1

Jeder Stil hat einige Nachteile, aber ich bevorzuge den von Ihnen angegebenen Stil. Der Include-Pfad darf keine Aufwärtsrelativität enthalten (z. B. ../.. ) und muss das Modul angeben, auf dem er beruht.

    
alemjerus 28.01.2010 17:06
quelle
1

Als kleine Verfeinerung empfehle ich, dass cc files in module1 direkt auf ihre .h -Dateien zugreifen:

%Vor%

oder ähnlich. Dies erzeugt einen visuellen Effekt in Ihren c-Dateien, der fremde Includes vom Standard-Include unterscheidet:

%Vor%     
Alex Brown 28.01.2010 17:18
quelle
1

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;

    
i_am_jorf 28.01.2010 17:18
quelle
1

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.

Dateien können verschoben werden

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.

Dateien verschieben, ohne sie zu ändern

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.

    
Thomas Matthews 28.01.2010 18:33
quelle

Tags und Links