Frage

Welche Reihenfolge sollte Header in einem Header / CPP-Datei deklariert werden? Offensichtlich diejenigen, die früher sein sollte und Klasse durch nachfolgende Header erforderlich sind, bestimmte Header in cpp Umfang nicht Umfang Header sein sollte, aber es gibt eine Menge, um convention / best practice?

War es hilfreich?

Lösung

In einer Header-Datei müssen Sie alle Header enthalten, um es übersetzbar zu machen. Und vergessen Sie nicht, Erklärungen zu verwenden, nach vorn anstatt einigen Header.

In einer Quelldatei:

  • entsprach Header-Datei
  • erforderlichen Projekt Header
  • 3rd-Party-Bibliotheken Header
  • Standardbibliotheken Header
  • System-Header

In dieser Reihenfolge werden Sie nicht alle Ihre Header-Dateien verpassen, die Bibliotheken, die von ihrer eigenen vergessen aufzunehmen.

Andere Tipps

Good Practice: jede .h-Datei sollte eine CPP haben, bevor irgendetwas anderes, dass .h erste enthält. Dies beweist, dass jede H-Datei zuerst gesetzt werden kann.

Auch wenn der Header keine Implementierung erfordert, machen Sie eine CPP, der folgendes beinhaltet nur, dass H-Datei und sonst nichts.

Das bedeutet dann, dass Sie Ihre Frage irgendeine Art und Weise zu beantworten, die Sie mögen. Es spielt keine Rolle, in welcher Reihenfolge Sie sind sie in.

Für weitere tolle Tipps, versuchen Sie dieses Buch: Groß C ++ Software Design - es ist eine Schande, dass es so teuer ist, aber es ist praktisch ein Survival Guide für Quellcode-Layout C ++

.

In-Header-Dateien, neige ich dazu, ersten Standard-Header zu setzen, dann meine eigenen Header (beide Listen alphabetisch geordnet werden). Bei der Implementierung von Dateien, habe ich zuerst den Header entspricht (falls vorhanden), dann Standards Header und andere Abhängigkeits Header.

Auftrag ist von geringer Bedeutung, es sei denn, wenn Sie einen großen Einsatz von Makros und #define machen; in diesem Fall müssen Sie überprüfen, dass ein Makro, das Sie nicht vorher enthalten eine definierte ersetzt (außer wenn es das ist, was Sie wollen, natürlich).

In Bezug auf diese Aussage

  

diejenigen, die durch nachfolgende Header benötigt werden, sollten früher sein

Ein Header sollte nicht auf andere Header verlassen, bevor sie enthalten! Wenn es Header erfordert, enthält es ihnen. Header Wachen werden mehrere Aufnahme verhindern:

#ifndef FOO_HEADER_H
#define FOO_HEADER_H
...
#endif

EDIT

Da ich diese Antwort schrieb, änderte ich meine Art und Weise der Richtlinien in meinem Code enthalten zu bestellen. Nun, ich versuche immer Header zu setzen, um die Standardisierung bei der Erhöhung, so dass die Header meines Projektes kommen zuerst, von 3rd-Party-Bibliotheken Header, gefolgt von Standard-Header.

Zum Beispiel, wenn einer meiner Datei eine Bibliothek verwendet ich schrieb, Qt, Boost und die Standard-Bibliothek, ich will, um die für enthält wie folgt:

//foo.cpp
#include "foo.hpp"

#include <my_library.hpp>
// other headers related to my_library

#include <QtCore/qalgorithms.h>
// other Qt headers

#include <boost/format.hpp> // Boost is arguably more standard than Qt
// other boost headers

#include <algorithms>
// other standard algorithms

Der Grund, warum ich die fehlenden Abhängigkeiten in meinem eigenen Header zu erkennen ist: Lassen Sie sich zum Beispiel annimmt, dass my_library.hpp std::copy verwendet, aber nicht <algorithm> umfassen. Wenn ich es nach <algorithm> in foo.cpp enthalten ist, wird diese fehlende Abhängigkeit unbemerkt bleiben. Im Gegenteil, mit der Bestellung nur präsentierte ich, wird sich beschweren, der Compiler, dass std::copy nicht deklariert worden ist, so dass ich my_library.hpp korrigieren.

In jeder „Bibliothek“ Gruppe, ich versuche, alphabetisch geordnet die include-Anweisungen zu halten, so dass sie leichter zu finden.

Auf Nebenbei bemerkt, eine gute Praxis ist auch die Abhängigkeit zwischen Headerdateien auf einem Maximum zu begrenzen. Dateien sollten so wenig wie möglich Header, insbesondere Header-Datei enthalten. Tatsächlich sind die mehr Header Sie sind, muss der mehr Code neu kompiliert werden, wenn sich etwas ändert. Eine gute Möglichkeit, diese Abhängigkeiten zu begrenzen Forward-Deklaration verwenden, die in Header-Dateien (siehe sehr oft ausreichen Wann kann ich eine Vorwärts-Deklaration verwenden ? ).

Google C ++ Style Guide, Namen und Reihenfolge der Includes :

  

In dir / foo.cc, deren Hauptzweck ist es, die Sachen in dir2 / foo2.h zu implementieren oder zu testen und bestellen Sie Ihre umfasst wie folgt:

     
      
  • dir2 / foo2.h (bevorzugte Lage - siehe Details unten)
  • .   
  • C Systemdateien.
  •   
  • C ++ Systemdateien.
  •   
  • Andere Bibliotheken H-Dateien.
  •   
  • Ihr Projekt H-Dateien.
  •   

Ich habe sie in alphabetischer Reihenfolge bestellen (leichter zu finden)

Das „Wie“ ist nicht offensichtlich, aber das „Was“ ist. Ihr Ziel ist es, sicherzustellen, dass die Reihenfolge, in der Sie sind Header-Dateien nie ankommt (und ich meine „NEVER!“).

Eine gute Hilfe ist zu prüfen, ob die Header-Dateien kompilieren beim Bau CPP-Dateien (einen für jede Header-Datei), die nur eine von ihnen gehört.

Für CPP-Dateien, sollten Sie den Kopf der Klasse gehören oder was auch immer Sie zuerst implementieren, so dass Sie den Fall zu fangen, wo dieser Header einige enthält fehlt. Danach neigen die meisten Code-Richtlinien System-Header zuerst, Projekt Header zweiten, beispielsweise, um die Google C ++ Style Guide .

Es ist eine Abhängigkeit Sache, und es hängt weitgehend von was Sie in unserem Header setzen. Eine Tatsache ist, dass Sie über diese wirklich berüchtigt sein kann und minimieren Sie Ihre beinhaltet strenge zu halten, aber Sie werden schließlich in einem Szenario führen, wo Sie den Einsatz Aufnahme Wachen wollen werden.

#ifndef MY_HEADER_H
#define MY_HEADER_H
//...
#endif

Das Problem ist nicht, dass am Anfang offensichtlich, aber da die Komplexität der Software so auch Ihre Abhängigkeiten wächst. Sie können gut tun, und darüber, aber größer C ++ Projekte sind in der Regel gespickt mit umfasst smart. Sie können versuchen, aber man kann nur so viel tun. So fleißig sein und denken Sie über Ihre enthält, JA! Aber Sie werden die meisten haben sicherlich zyklische Abhängigkeiten zu einem bestimmten Zeitpunkt und das ist, warum Sie die Aufnahme Wachen brauchen.

Wenn ein Header braucht andere Header dann enthält sie nur in diesem Header.

Versuchen Sie, Ihren Code zu strukturieren, so dass Sie Zeiger oder Verweise passieren und nach vorn erklären, wo Sie können.

Bei der Umsetzung wird der Header, der sie definiert sollte zuerst aufgeführt werden (außer in Visual Studio, wenn Sie pch verwenden, dann würde stdafx gehen zuerst).

Ich liste sie im Allgemeinen als ich brauche.

Ich habe die folgende Konvention fanden die nützlichsten:

module.cpp:

// this is the header used to trigger inclusion of precompiled headers
#include <precompiled.h> 
// this ensures that anything that includes "module.h" works
#include "module.h"
// other headers, usually system headers, the project

Das Wichtigste ist, das Modul des Headers als erster nicht-vorkompilierte Header zu setzen. Dies stellt sicher, „module.h“ hat keine unerwarteten Abhängigkeiten.

Wenn Sie auf einem großen Projekt arbeiten mit mal langsam Plattenzugriff, ich habe diesen Stil gesehen verwendet Bauzeiten zu verringern:

module.cpp:

// this is the header used to trigger inclusion of precompiled headers
#include <precompiled.h> 
// this ensures that anything that includes "module.h" works
#include "module.h"
// other headers, usually system headers, the project
#if !defined _OTHER_MODULE_GUARD_
#include "other_module.h"
#endif 

#if !defined _ANOTHER_MODULE_GUARD_
#include "another_module.h"
#endif 

Es ist ein ausführlich wenig, aber nicht auf der Festplatte seeking sparen, da der Header für / geöffnet nicht durchsucht werden, wenn sie bereits aufgenommen worden ist. Ohne die Wache zu überprüfen, wird der Compiler für suchen und die Header-Datei öffnen, analysiert die gesamte Datei #ifdefing die gesamte Datei aus, um am Ende.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top