Stilfrage: Include von Headern, die schon in anderen Headern eingebunden werden?
-
Hallo,
ich frage mich gerade was besserer Stil ist: Redundante includes wegzulassen oder nicht.
Folgendes Minimalbeispiel: Ein Header deklariert irgendwelche tollen Sachen. Dafür benötigt er ein paar Deklarationen aus einem anderen Header. Sollte man jetzt bei der Implementierung alle Header nochmals einbinden oder sich das sparen, weil die sowieso schon eingebunden sind?
MeinHeader.h
#include "MeinTyp.h" MeinTyp MeineFunktion();MeineImplementierung.cpp
#include "MeinHeader.h" #include "MeinTyp.h" // Ja oder Nein? MeinTyp MeineFunktion(){ // Verwendet Sachen aus beiden Headern }Ich bin da unentschieden. Es macht ja technisch (fast) überhaupt keinen unterschied, da die doppelt eingebunden Header ignoriert werden (sollten). Also ist es eine Sache der Übersichtlichkeit: Wenn ich die Header weglasse und später will man irgendwas in den Headern nachschlagen, dann wird das eine Schnipseljagd nach den richtigen Dateien. Listet man alle benutzten Header auf, so kann das, je nachdem wie konsequent man dabei ist, eine ziemlich lange und unübersichtliche Liste werden.
-
Alles, was Du unmittelbar brauchst, sollst Du inkludieren. Doppelungen dieser Art sind eh includeguard-geschützt und kosten nicht mehr als je 10 Mikrosekunden.
Ach, wie viele erwachsene Programmierer habe ich schon weinen sehen, als sie ihr Standard-C++-Programm mal schnell auf der anderen Maschine comilieren wollten, aber weil sie nicht das inkludiert hatten, was sie brauchten, sondern sich darauf verlassen hatten, daß <iostream> die <cstdlib> inkludiert und so, nur weil das bei ihnen daheim mal so war.Trotzdem würde ich wohl die "MeinTyp.h" dort nicht inkludieren. Daß es schon mittelbar inkludiert wurde, ist ja sichergestellt.
-
In einer Header-Datei reicht meistens eine Forward-Declaration, so das man kein Include benötigt. Wenige Ausnahmen muß man auch im Header ein Include setzen.
In einer Implementierungs-Datei (*.cpp oder *.cc) muß man eh inkludieren, weil man da ja spätestens die Typ-Definitionen benötigt.