Ich war immer verwirrt über Header-Dateien. Sie sind so seltsam: Sie enthalten eine .h-Datei, die keine .cpp-Datei enthält, aber .cpp-Dateien werden auch kompiliert.
Kürzlich bin ich einem Teamprojekt beigetreten, und natürlich werden sowohl .h als auch .cpp verwendet.
Ich verstehe, dass dies sehr wichtig ist, aber ich kann nicht damit leben, jede Funktionsdeklaration in jeder von mehreren Klassen einzufügen, die wir haben.
Wie gehe ich effizient mit der 2-Datei-Konvention um?
Gibt es Tools, die Ihnen dabei helfen, oder ändern Sie automatisch eine Datei, die wie im folgenden Beispiel aussieht, in .h und .cpp? (speziell für MS VC ++ 2010)
class A
{
...
Type f(Type a,Type b)
{
//implementation here, not in another file!
}
...
};
Type f(Type a)
{
//implementation here
}
...
c++
language-design
naming
Oleh Prypin
quelle
quelle
Antworten:
Schreiben Sie mehr Refactoring Friendly C ++
In C ++ Sie nicht haben , um Header überhaupt. Sie können das gesamte Objekt in einer Datei wie in C # oder Java definieren. C-Entwickler speichern normalerweise nur externe Aufrufe in einer Header-Datei. Alle internen Aufrufe werden in der C-Datei definiert. Ebenso können Sie Ihre C ++ .h-Dateien für die Klassen / Interfaces (rein virtuelle abstrakte Klassen) / etc reservieren. die außerhalb der DLL freigegeben werden sollen. Für interne Klassen / Strukturen / Schnittstellen usw. fügen Sie einfach die benötigte CPP-Datei ein:
Dies scheint nicht der populärste Ansatz zu sein, aber es ist legal C ++. Es wäre definitiv eine Möglichkeit für all Ihren internen Code. Dadurch können sich der interne Code und die Gruppe von Klassen wesentlich radikaler ändern und gleichzeitig eine stabilere Schnittstelle für den Code außerhalb Ihrer Bibliothek / ausführbaren Datei zur Interaktion bereitstellen.
Wenn Sie Ihre gesamte Klasse in einer Datei haben, können Sie leichter tun, was Sie wollen. Es löst nicht das Problem, eine Methode umzubenennen und nach jedem Ort zu suchen, an dem diese Methode aufgerufen wird, stellt jedoch sicher, dass verständlichere Fehlermeldungen angezeigt werden. Es gibt nichts Schlimmeres, als wenn Ihr Header eine Methode in eine Richtung deklariert, aber Sie implementieren sie anders. Anderer Code, der die Header-Datei aufruft, wird ordnungsgemäß kompiliert, und Sie erhalten eine Link-Ausnahme, während die Implementierungsdatei diejenige ist, die sich darüber beschwert, dass die Methode nicht definiert wurde. Wenn Sie jede Methode direkt definieren (in der eigentlichen Klassendeklaration), wird dieselbe Fehlermeldung angezeigt, unabhängig davon, in welcher Datei sie enthalten ist.
Vielleicht möchten Sie sich auch diese Frage ansehen: Gute Refactoring-Tools für C ++
Wie C / C ++ Header- / Implementierungsdateien auflöst
Auf der Basis-C-Ebene (und C ++ baut auf dieser Grundlage auf) deklarieren die Header-Dateien das Versprechen einer Funktion / Struktur / Variablen, die ausreicht, damit ein Compiler die Objektdatei erstellen kann. In ähnlicher Weise deklarieren C ++ - Headerdateien das Versprechen von Funktionen, Strukturen, Klassen usw. Mit dieser Definition reserviert der Compiler Speicherplatz im Stapel usw.
Die C- oder CPP-Dateien haben die Implementierung. Da der Compiler jede Implementierungsdatei in eine Objektdatei konvertiert, gibt es Verknüpfungen zu nicht implementierten Konzepten (was im Header deklariert wurde). Der Linker verknüpft die Hooks mit den Implementierungen in anderen Objektdateien und erstellt eine größere Binärdatei, die den gesamten Code enthält (gemeinsam genutzte Bibliothek oder ausführbare Datei).
VS-spezifisch
Für die Arbeit mit Visual Studio gibt es einige Assistenten, die die Arbeit etwas erleichtern. Der neue Klassenassistent erstellt das passende Paar aus Header- und Implementierungsdateien. Es gibt sogar eine Klassenbrowser-Funktion, mit der Sie neue Methoden deklarieren können. Die Definition wird in den Header und der Implementierungs-Stub in die CPP-Datei eingefügt. Visual Studio bietet diese Funktionen seit mehr als einem Jahrzehnt (sofern ich sie verwendet habe).
quelle
Werden Sie Java-Entwickler.
Wenn Sie wirklich in C ++ weiterentwickeln müssen, können Sie versuchen, eine IDE zu verwenden. Häufig bieten sie einen Mechanismus, mit dem Sie einer Klasse eine Methode hinzufügen können, und die Deklaration wird automatisch in die .h-Datei und die Definition in die .cpp-Datei eingefügt.
quelle
Vielleicht interessieren Sie sich für das Makeheaders- Programm von Hwaci (diejenigen, die SQLite und Fossil betreiben).
Schauen Sie sich auch an, wie Fossilien gebaut werden , um eine Idee zu haben.
quelle
Wenn Sie die ersten Zeilen einer neuen Klasse schreiben, liegt dies normalerweise daran, dass Sie sie zu diesem Zeitpunkt nur an einer Stelle benötigen. Zu einem späteren Zeitpunkt wird es möglicherweise an mehreren Orten verwendet, anfangs ist dies jedoch normalerweise nicht der Fall.
Viele meiner Kurse beginnen oben in der aktuellen CPP-Datei. Wenn es stabil genug ist, um es an mehreren Stellen zu verwenden, schneide ich es in eine Kopfzeile ein. Obwohl die Klasse oft so schnell verschwindet, wie sie erschien.
quelle
Als Anregung für den Umgang mit C ++ - Header-Dateien ist es üblich, sie ohne Dateierweiterung oder Dateiendung zu verwenden, wie dies bei "GCC" -Bibliotheken der Fall ist.
In diesem Fall empfehle ich die Verwendung eines " .hpp" (oder "unleast"). .hxx") oder des Dateisuffix.
Möglicherweise müssen Sie den Compiler, die Entwicklerumgebung oder das erstellte Programm konfigurieren.
quelle
#include <iostream>
? Das ist nicht nur für die GCC-Bibliothek. Tatsächlich ist es im C ++ - Standard von 1997 , Abschnitt 17.3.1.2 definiert. Ich würde es vermeiden, solche Dateien zu benennen. Sie können, aber der Grund, warum die C ++ - Standardbibliothek dies tat, war wahrscheinlich, Namenskonflikte zu vermeiden. Eigentlich finde ich es sehr seltsam, wenn Compiler beim Einfügen eines Headers automatisch ein '.h' hinzufügen, was für mich ziemlich ungewöhnlich ist. Und ich sehe nie jemanden Namensüberschriften ohne Suffix außer der C ++ - Standardbibliothek.#include <someclass>
, wie#include <someclass.hpp>
auf allen Compilern gelesen zu werden . Ihr Code wird kaputt gehen.