Kopfdateien sind ein integraler Bestandteil der Sprache. Ohne Kopfdateien werden alle statischen Bibliotheken, dynamischen Bibliotheken, so ziemlich jede vorcompilierte Bibliothek nutzlos. Kopfdateien machen es auch einfacher, alles zu dokumentieren, und es ist möglich, die API einer Bibliothek/Datei zu überprüfen, ohne jeden einzelnen Code zu überprüfen.
Sie machen es auch einfacher, Ihr Programm zu organisieren. Ja, Sie müssen ständig zwischen Quelle und Kopf wechseln, aber sie erlauben es Ihnen auch, interne und private APIs innerhalb der Implementierungen zu definieren. Zum Beispiel:
MySource.h:
extern int my_library_entry_point(int api_to_use, ...);
MySource.c:
int private_function_that_CANNOT_be_public();
int my_library_entry_point(int api_to_use, ...){
// [...] Mach was
}
int private_function_that_CANNOT_be_public() {
}
Wenn Sie #include
verwenden, erhalten Sie my_library_entry_point
.
Wenn Sie #include
verwenden, erhalten Sie auch private_function_that_CANNOT_be_public
.
Sie sehen, wie das sehr schlimm sein könnte, wenn Sie eine Funktion hätten, um eine Liste von Passwörtern zu erhalten, oder eine Funktion, die Ihren Verschlüsselungsalgorithmus implementiert, oder eine Funktion, die die internen Abläufe eines Betriebssystems offenlegt, oder eine Funktion, die Berechtigungen außer Kraft setzt, usw.
14 Stimmen
Ich glaube, es gibt keinen wirklichen Grund für Headerdateien in C++. Alle darin gespeicherten Informationen sind im .cpp dupliziert und können automatisch extrahiert werden (wie von www.lazycplusplus.com demonstriert - Haftungsausschluss: nicht verwendet). Das Problem ist die Kompilierungsgeschwindigkeit und C#&Java haben gezeigt, dass dies überwindbar ist.
0 Stimmen
Wie kann www.lazycplusplus.com alle Informationen erhalten? Was ist, wenn ich einen void-Pointer in der Header-Datei für zukünftige Verwendung deklarieren und reservieren wollte? Es wird nie in der cpp-Datei verwendet oder referenziert.
1 Stimmen
THanks.... Ich habe auch keine Ahnung, warum es abgelehnt wurde.
3 Stimmen
Brian: Was bedeutet es, einen "Leerzeiger reservieren"? Wie du wahrscheinlich weißt, muss statisch allokierte Daten in C/C++ manuell im .cpp definiert werden, nachdem sie im Header deklariert wurden (es sei denn, es handelt sich um eine Dateibereichs-Deklaration). Mit LazyC++ kannst du einfach die Header-Deklaration überspringen und die Implementierungsdefinition schreiben.
0 Stimmen
Ich würde gerne eine bessere Lösung als Header-Dateien sehen, aber aufgrund von Rückwärtskompatibilitätsproblemen (die oft zu Rückwärtskompatibilitätskämpfen führen - man muss lieben, wie das Ändern von privaten Klassenmembern das ABI bricht und Sie zwingt, PIMPLs zu verwenden) glaube ich nicht, dass wir eine weniger schlimme Alternative haben... Upgevotet.
1 Stimmen
Nicht alle Informationen befinden sich in der CPP-Datei... Ob eine Methode virtuell ist oder nicht, steht sicherlich nicht in der CPP-Datei. Klassenbeziehungen sind ebenfalls nicht Bestandteil der CPP-Datei. Die Liste könnte noch weitergehen, aber das reicht aus, um die Behauptung zu widerlegen.
0 Stimmen
@Iraimbilanja: Ich möchte die Größe der Klasse "auffüllen", um Platz für zukünftige Erweiterungen zu reservieren. Dies ist in Win32-Strukturen recht häufig, um eine reservierte Variable zu sehen, die für nichts verwendet wird. Ich spreche nicht von statischen Elementen.
0 Stimmen
@Iraimbilanja: Ich sehe jetzt, dass LazzC++ dich zwingt, viele Informationen in der cpp-Datei zu duplizieren. Ich hatte wirklich ein Problem mit deiner anfänglichen Aussage, dass "Alle Informationen, die in ihnen [Header-Dateien] gespeichert sind, im .cpp dupliziert werden und automatisch extrahiert werden können", was einfach nicht wahr ist.
0 Stimmen
Tim, in der Tat. Deshalb definiert man in LazyC++ alle Klassenmember innerhalb der Klassendefinition. Zum Beispiel könnte Ihr Quellcode .cpp (nicht Ihr Header, Sie haben keinen) wie folgt aussehen: class Foo { public: void eat() { /*some code*/ } void sleep() { /*some code*/ } };
3 Stimmen
Brian - siehe meine Antwort an Tim. In LazyC++ schreibst du wirklich die Klassendefinition (einschließlich etwaigem Padding), du duplizierst einfach nicht die Dinge. Übrigens ist dein "reservation" ein nicht portabler Hack, du bist besser dran mit dem Cheshire-Cat-Idiom.
0 Stimmen
@Iraimbilanja: Sie können absichtlich Code auf diese Weise schreiben, jedoch wird auch nach dem Ausführen von LazyC++ zwei Dateien generiert und die cpp-Datei wird nicht alle Informationen in der Header-Datei enthalten. Virtuelle Funktionen sind ein viel besseres Beispiel als mein Beispiel mit "unbenutzter Variable".
0 Stimmen
Sicher, die resultierende cpp enthält nicht alle Daten, die im Header vorhanden sind. Warum kümmert es dich jedoch? Es handelt sich nur um ein Implementierungsdetail. Der Punkt ist, dass du dich darum nicht kümmern musst, der Compiler erledigt das für dich.
0 Stimmen
@Iraimbilanja: Lesen Sie Ihren ersten Kommentar noch einmal durch. Es scheint, dass ich meine Header-Dateien aus meinen vorhandenen Cpp-Dateien extrahieren kann, was absurd ist. Ich kann sie jedoch zunächst kombinieren und dann LazyC++ verwenden, um sie zu extrahieren. LazyC++ erfordert, dass Sie kombinieren, aber das ist kein Beweis für Ihre Behauptung "doppelte Informationen".
0 Stimmen
Vereinbart, ich war in meinem ersten Kommentar nicht so klar wie möglich. Das gesagt, vielleicht können wir wieder zum Thema zurückkehren... was denkst du über die Frage des EP?
0 Stimmen
Ja, entschuldige, dass ich ständig poste, Freund, es ist klar, dass wir beide verstehen. Ich bin hin- und hergerissen in dieser Angelegenheit. Das Pflegen einer Header-Datei ist oft mühsam, aber eine einzige riesige Datei kann schwer zu navigieren sein. LazyC++ ist ein interessantes Konzept, aber ich werde mich davon fernhalten, es sei denn, es wird von meinem IDE/Compiler-Anbieter unterstützt.
0 Stimmen
Wie ist diese Frage immer noch offen? Es ist völlig off-topic und sollte als "meinungsbasiert" geschlossen werden.
2 Stimmen
Posting this as a comment because I'm not certain in my information :) and I'm not sure why this is getting voted down and for closing. It's an excellent question IMO. ;)