Es ist nicht unbedingt überflüssig. Die Tatsache, dass Sie getrennte Header-Dateien und Quelldateien haben, bedeutet, dass Sie src- und Header-Dateien austauschen können, solange die Quelldateien Definitionen für die Header-Dateien liefern.
Die .h-Datei sollte nur Dinge enthalten, die im Header verwendet werden. Sie braucht zum Beispiel stdio nicht, wenn es keine io-Deklarationen im Header gibt, stattdessen sollte sie nur in die src-Datei aufgenommen werden, wenn sie zum Beispiel printf verwendet.
Es kann jedoch Situationen geben, in denen ein Header, den Sie verwenden können, ein bestimmtes Include benötigt, während ein anderer Header nicht benötigt wird (z.B. wenn ein Header eine restriktivere Schnittstelle ist als der andere). In diesem Fall ist es besser, die .h-Includes zu duplizieren.
Da es geschützt ist, macht es wirklich keinen Unterschied zu dem endgültigen Objekt/der endgültigen Exe, die Sie produzieren, und es erhöht die Kompilierzeit um nichts, worüber man sich Gedanken machen sollte. Es ist also besser, sie einzuschließen, nur für den Fall, dass Sie irgendwann eine andere .h-Datei verwenden wollen.
edit: konkreteres Beispiel inc1.h
#ifndef INC1_H
#define INC1_H
inc1_struct {
int x;
};
#endif
inc2.h
#ifndef INC2_H
#define INC2_H
#include "inc1.h"
void inc2_f();
struct inc1_struct *inc2_callinc1();
#endif
prog.cpp #include "inc1.h" #include "inc2.h"
include #include
void inc2_f() {
printf("inc2_f\n");
}
struct inc1_struct *inc2_callinc1() {
return (struct inc1_struct*) malloc(sizeof(struct inc1_struct));
}
int main(int argc, char **argv) {
struct inc1_struct *s = inc2_callinc1();
return 0;
}
Dies würde kompilieren, aber sagen wir mal, Sie wollen nicht die
struct inc1_struct *inc2_callinc1();
in inc2.h
Dann brauchen Sie inc1.h nicht in die Datei inc2.h einzubinden, aber wenn Sie nicht auch die Definition von inc2_callinc1() in prog.cpp löschen wollen, dann müssen Sie inc1.h einbinden.