In welcher Reihenfolge sollten Include-Dateien angegeben werden, d.h. was sind die Gründe für die Aufnahme eines Headers vor einem anderen?
Werden zum Beispiel die Systemdateien, STL und Boost vor oder nach den lokalen Include-Dateien eingefügt?
In welcher Reihenfolge sollten Include-Dateien angegeben werden, d.h. was sind die Gründe für die Aufnahme eines Headers vor einem anderen?
Werden zum Beispiel die Systemdateien, STL und Boost vor oder nach den lokalen Include-Dateien eingefügt?
Ich glaube nicht, dass es eine empfohlene Reihenfolge gibt, Hauptsache, es wird kompiliert! Was ärgerlich ist, ist, wenn einige Header erfordern, dass andere Header zuerst eingefügt werden... Das ist ein Problem mit den Headern selbst, nicht mit der Reihenfolge der Includes.
Ich persönlich ziehe es vor, von der lokalen bis zur globalen Ebene zu gehen, jeden Unterabschnitt in alphabetischer Reihenfolge, d.h.:
Meine Begründung für 1. ist, dass es beweisen sollte, dass jeder Header (für den es eine cpp gibt) #include
d ohne Voraussetzungen (terminus technicus: Header ist "in sich geschlossen"). Und der Rest scheint einfach logisch daraus zu folgen.
Wichtig ist, dass Ihre Kopfzeilen nicht davon abhängig sind, dass andere Kopfzeilen zuerst eingefügt werden. Eine Möglichkeit, dies zu gewährleisten, besteht darin, Ihre Kopfzeilen vor allen anderen Kopfzeilen einzufügen.
In "Thinking in C++" wird dies besonders erwähnt, wobei auf Lakos' "Large Scale C++ Software Design" verwiesen wird:
Latente Verwendungsfehler können vermieden werden, indem sichergestellt wird, dass die .h-Datei einer Komponente von selbst parst - ohne extern bereitgestellte Deklarationen oder Definitionen... Das Einfügen der .h-Datei als allererste Zeile der .c-Datei stellt sicher, dass keine kritische Information, die für die physische Schnittstelle der Komponente wichtig ist, in der .h-Datei fehlt (oder, falls doch, dass Sie dies herausfinden, sobald Sie versuchen, die .c-Datei zu kompilieren).
Das heißt, sie sollten in der folgenden Reihenfolge aufgenommen werden:
Wenn eine der Kopfzeilen ein Problem damit hat, in dieser Reihenfolge aufgeführt zu werden, sollten Sie sie entweder korrigieren (falls vorhanden) oder nicht verwenden. Boykottieren Sie Bibliotheken, die keine sauberen Header schreiben.
Googles C++-Style Guide argumentiert fast die umgekehrte Variante, für die es eigentlich keinerlei Rechtfertigung gibt; ich persönlich neige dazu, den Lakos-Ansatz zu bevorzugen.
Ich befolge zwei einfache Regeln, die die meisten Probleme vermeiden:
Ich befolge auch die Leitlinien von:
Mit anderen Worten:
#include <stdio.h>
#include <string.h>
#include "btree.h"
#include "collect_hash.h"
#include "collect_arraylist.h"
#include "globals.h"
Aber da es sich um Leitlinien handelt, ist das eine subjektive Sache. Die Regeln hingegen setze ich rigoros durch, sogar bis zu dem Punkt, dass ich "Wrapper"-Header-Dateien mit Include-Guards und gruppierten Includes zur Verfügung stelle, wenn ein unausstehlicher Drittentwickler sich nicht an meine Vision hält :-)
Meinen eigenen Ziegelstein zur Mauer hinzufügen.
Also gehe ich normalerweise so vor:
// myproject/src/example.cpp
#include "myproject/example.h"
#include <algorithm>
#include <set>
#include <vector>
#include <3rdparty/foo.h>
#include <3rdparty/bar.h>
#include "myproject/another.h"
#include "myproject/specific/bla.h"
#include "detail/impl.h"
Jede Gruppe ist durch eine Leerzeile von der nächsten Gruppe getrennt:
Beachten Sie auch, dass sich jede Datei, abgesehen von den Systemheadern, in einem Ordner mit dem Namen ihres Namensraums befindet, weil es auf diese Weise einfacher ist, sie zu finden.
Ich empfehle:
Und natürlich in alphabetischer Reihenfolge innerhalb der einzelnen Abschnitte, soweit möglich.
Verwenden Sie immer Forward-Deklarationen, um unnötige #include
s in Ihren Header-Dateien.
CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.