2012-04-14 6 views
2

Wir definieren eine C++ - Klasse in einem .h und definieren ihre Methoden in einem .cpp, aber es macht den Code weniger organisiert.Wird die ausführbare Datei größer, wenn eine ganze Klassendefinition in ein ".h" eingefügt wird?

Ich möchte alle Definition der Methode in der Klassendefinition, die in einer .h-Datei ist, aber ich mache mir Sorgen, dass der Compiler doppelten Code für die gleichen Methoden/Funktionen generieren, wenn eine Klasse Header-Datei von verschiedenen Dateien enthalten ist.

Erkennt der Linker die doppelten Codeteile, um die Dateigröße zu reduzieren?

Wenn nicht, ist es besser .hpp stattdessen zu verwenden? Ich habe gehört, dass ein .hpp dafür ist.

Und es macht einen kleinen Unterschied, wenn ich nur eine .h Datei für eine .hpp (ich weiß nicht warum), mit G ++ kompiliert ändern.

Antwort

0

Es gibt alles, was Sie brauchen here: Header files, pros and cons of putting all you code in them. Ich hoffe es hilft!

Die Verwendung von Header-Dateien führt zu einer schnelleren Kompilierzeit und kleineren ausführbaren Dateien. Es sieht auch wesentlich sauberer aus, da Sie einen schnellen Überblick über Ihre Klasse erhalten, indem Sie sich die .h-Deklaration ansehen.

+0

Offsite-Links sind keine guten Antworten. Sie müssen die Frage hier beantworten, nicht nur einen Link zur Verfügung stellen –

+0

@DavidHeffernan: Der Link verweist auf stackoverflow.com wie ist das Off-Site? (Ich stimme jedoch dem Kern Ihrer Aussage zu) – bitmask

+0

Beantwortet auch nicht wirklich die Frage direkt. –

0

Sie müssen sich keine Sorgen machen. Es macht absolut keinen Unterschied, wie es zerbrochen ist, es ist, was Ihre Dateien beschreiben, die es größer macht, nicht, wie diese Beschreibung ausgebreitet wird.

.h oder .hpp macht auch keinen Unterschied.

+1

Wahrscheinlich ist der einzige Unterschied, dass Texteditoren '.h' als C hervorheben, während sie' .hpp' als C++ markieren. Und siehe Nawazs Antwort für Gründe, warum die Platzierung der Definition von Bedeutung ist. –

+0

Sehr fraglich, wenn Sie für Release/mit Optimierungen kompilieren. –

3

Ja. Es kann größere ausführbare erstellen, und das ist, weil die Elementfunktionen, die in der Klasse selbst definiert sind, inlinestandardmäßig, ob Sie das Schlüsselwort inline in der Definition oder nicht erwähnen. Normalerweise verursacht die inline Funktion eine größere ausführbare Datei, da der Compiler sie mehrfach definiert, wo immer sie aufgerufen wird.

+0

Es gibt auch das Problem, dass verschiedene Kompilierungseinheiten dynamisch verlinken, sodass dies die ausführbare Datei * drastisch * reduzieren kann. –

1

.h vs .hpp ist die 90% Äquivalenz von

#include <cmath> vs #include <math.h> 

Einige Leute bevorzugen .hpp zu verwenden, wenn sie exklusiv C++ Programmierung tun. Sie werden .hpp in Bibliotheken wie Boost sehen.

Die anderen 10% sind jedoch sehr wichtig. Zum Beispiel von Boost Bibliothek doc nehmen, erklären sie den Grund der Verwendung von .hpp über .h:

meisten Boost-Bibliotheken sind header-only: sie vollständig aus Header besteht Dateien Vorlagen und Inline-Funktionen enthalten, und erfordert keine separat kompilierte Bibliotheksbinärdateien oder spezielle Behandlung, wenn Verknüpfung.

Wenn Sie in diesem Fall fallen, sollten Sie .hpp verwenden, aber das kann längere Kompilierungszeit kosten. Andernfalls möchten Sie möglicherweise .h Stil beibehalten.Das ist nur mein persönlicher Geschmack. Es ist nicht C-oriented überhaupt, in meiner ehrlichen Meinung.

Weiterführende Literatur:

Splitting templated C++ classes into .hpp/.cpp files--is it possible?

Condensing Declaration and Implementation into an HPP file

C++ templates declare in .h, define in .hpp

+0

Das Zitat aus der Boost-Dokumentation erklärt nicht, warum sie ihre Dateien '.hpp' anstatt' .h' nennen. –

0

Um Ihre Frage zu einem größeren ausführbaren zu beantworten, ja es wird die ausführbare Datei größer. Wenn Sie eine Header-Datei in eine Quell- oder Header-Datei einfügen, ersetzt der Präprozessor das # include durch den Inhalt der Header-Datei. Aus diesem Grund ist es notwendig, Ihre Header-Dateien mit dem folgenden Header Schutz zu schützen:

#ifndef HDR_H 
#define HDR_H 

... 

#endif 

Sie werden jedoch Linker Fehler erhalten, wenn Sie die Header-Datei enthalten (das hat Funktionsdefinitionen) in mehrere Dateien, die Teil sind von die gleiche ausführbare Datei. Es wäre sinnvoll, Klassen- und Funktionsdefinitionen und Deklarationen in .cpp- und .hpp-Dateien zu unterteilen. Dies wird die Menge an Linker-Kopfschmerzen stark reduzieren.

Auch, .h = .hpp. Es spielt keine Rolle, welchen du wählst. Persönliche Präferenz ...

Verwandte Themen