Eines der Ziele von C++ ist es, eine Obermenge von C zu sein, und es ist schwierig, dies zu erreichen, wenn es keine Header-Dateien unterstützen kann. Ein weiterer Punkt ist, dass wenn Sie Header-Dateien entfernen möchten, Sie genauso gut auch CPP (den Pre-Prozessor, nicht Plus-Plus) komplett entfernen könnten; sowohl C# als auch Java spezifizieren keine Makro-Präprozessoren in ihren Standards (aber es sollte angemerkt werden, dass sie in einigen Fällen sogar mit diesen Sprachen verwendet werden können).
Wie C++ derzeit entworfen ist, benötigen Sie Prototypen - genauso wie in C -, um jeglichen kompilierten Code zu prüfen, der auf externe Funktionen und Klassen verweist. Ohne Header-Dateien müssten Sie diese Klassendefinitionen und Funktionsdeklarationen manuell eingeben, bevor Sie diese verwenden können. Um auf Header-Dateien in C++ zu verzichten, müssten Sie eine Funktion in der Sprache hinzufügen, die etwas wie das import
-Stichwort in Java unterstützen würde. Das wäre eine große Änderung; um Ihre Frage zu beantworten, ob dies praktikabel wäre: Ich denke nicht - überhaupt nicht.
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. ;)