76 Stimmen

Sollte C++ Header-Dateien eliminieren?

Viele Sprachen wie Java, C# trennen Deklaration und Implementierung nicht. C# hat ein Konzept der teilweisen Klasse, aber Implementierung und Deklaration bleiben dennoch in der gleichen Datei.

Warum hat C++ nicht das gleiche Modell? Ist es praktischer, Kopfdateien zu haben?

Ich beziehe mich auf aktuelle und kommende Versionen des C++-Standards.

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.

-1voto

qax Punkte 1

Ich verstehe immer noch nicht den Sinn einiger Aussagen. Die Trennung von API und Implementierung ist eine sehr gute Sache, aber Header-Dateien sind keine API. Dort befinden sich private Felder. Wenn Sie private Felder hinzufügen oder entfernen, ändern Sie die Implementierung und nicht die API.

-1voto

Lux Punkte 1525

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.

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