10 Stimmen

C++-Header-Politik bei großen Projekten (redux)

Ich habe alles gelesen, was ich zu diesem Thema finden konnte, einschließlich einiger sehr hilfreicher Diskussionen auf dieser Website, der NASA-Codierungsrichtlinien und der Google C++-Richtlinien. Ich habe sogar das hier empfohlene Buch "Physical C++ Design" gekauft (sorry, habe den Namen vergessen) und einige nützliche Ideen daraus gewonnen. Die meisten Quellen scheinen darin übereinzustimmen, dass Header-Dateien in sich geschlossen sein sollten, d.h. sie sollten nur das enthalten, was sie brauchen, so dass eine cpp-Datei den Header enthalten kann, ohne dass andere hinzugefügt werden müssen, und kompiliert werden kann. Ich verstehe auch den Punkt mit der Vorwärtsdeklaration statt Einbindung, wann immer es möglich ist.

Wie wäre es also, wenn foo.cpp enthält bar.h y qux.h aber es stellt sich heraus, dass bar.h selbst umfasst qux.h ? Sollte foo.cpp dann vermeiden Sie die Aufnahme von qux.h ? Pro: räumt auf foo.cpp (weniger "Rauschen"). Nachteil: wenn jemand bar.h so ändert, dass sie nicht mehr die qux.h , foo.cpp auf mysteriöse Weise nicht mehr kompiliert werden kann. Außerdem verursacht die Abhängigkeit zwischen foo.cpp y qux.h nicht offensichtlich sein.

Wenn Ihre Antwort lautet "eine cpp-Datei sollte jeden Header, den sie benötigt, #include", dann würde das in seiner logischen Schlussfolgerung bedeuten, dass so ziemlich jede cpp-Datei Folgendes tun muss #include <string>, <cstddef> usw., da der meiste Code diese am Ende verwenden wird, und wenn Sie sich nicht darauf verlassen sollen, dass ein anderer Header diese enthält, muss Ihre cpp diese explizit einschließen. Das scheint eine Menge "Lärm" in den cpp-Dateien zu sein.

Was denken Sie?

Frühere Diskussionen:

Welche Techniken gibt es, um Kompilierungsabhängigkeiten in C++-Projekten zu begrenzen?

Ihre bevorzugte C/C++-Header-Politik für große Projekte?

Wie kann ich die Suche nach unbenutzten #include-Direktiven automatisieren?

ETA: Inspiriert durch frühere Diskussionen hier, habe ich ein Perl-Skript geschrieben, das nacheinander jedes "include" und "using" auskommentiert und dann versucht, die Quelldatei neu zu kompilieren, um herauszufinden, was nicht benötigt wird. Ich habe auch herausgefunden, wie man es in VS 2005 integrieren kann, so dass man mit einem Doppelklick zu den "unbenutzten" Includes wechseln kann. Wenn jemand es will, lassen Sie es mich wissen ... sehr viel experimentell im Moment aber.

CodeJaeger.com

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.

Powered by:

X