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?
Das ist eine schwierige Frage in der C/C++-Welt, in der es so viele Elemente jenseits des Standards gibt.
Ich denke, dass die Reihenfolge der Header-Dateien kein ernsthaftes Problem darstellt, solange sie kompiliert werden können, wie Squelart sagte.
Meine Ideen sind: Wenn es keinen Konflikt von Symbolen in all diesen Headern gibt, ist jede Reihenfolge in Ordnung, und das Problem der Header-Abhängigkeit kann später durch Hinzufügen von #include-Zeilen in der fehlerhaften .h behoben werden.
Das eigentliche Problem entsteht, wenn eine Kopfzeile ihre Aktion (durch Überprüfung der #if-Bedingungen) je nach den darüber liegenden Kopfzeilen ändert.
Zum Beispiel in stddef.h in VS2005, gibt es:
#ifdef _WIN64
#define offsetof(s,m) (size_t)( (ptrdiff_t)&(((s *)0)->m) )
#else
#define offsetof(s,m) (size_t)&(((s *)0)->m)
#endif
Nun das Problem: Wenn ich einen benutzerdefinierten Header ("custom.h") habe, der mit vielen Compilern verwendet werden muss, einschließlich einiger älterer Compiler, die keine offsetof
in ihren Systemkopfzeilen, sollte ich in meine Kopfzeile schreiben:
#ifndef offsetof
#define offsetof(s,m) (size_t)&(((s *)0)->m)
#endif
Und stellen Sie sicher, dass Sie den Benutzer auffordern #include "custom.h"
après alle Systemkopfzeilen, andernfalls wird die Zeile von offsetof
in stddef.h führt zu einem Fehler bei der Neudefinition eines Makros.
Wir beten, dass wir in unserer Laufbahn keine solchen Fälle mehr erleben werden.
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.