Wat is het verschil tussen een .cpp-bestand en een .h-bestand?

Omdat ik .cpp-bestanden heb gemaakt en ze vervolgens naar .h-bestanden heb overgebracht, is het enige verschil dat ik kan vinden dat je geen .cpp-bestanden kunt #includeren. Is er een verschil dat ik mis?


Antwoord 1, autoriteit 100%

Het C++ build-systeem (compiler) kent geen verschil, dus het is allemaal een van de conventies.

De afspraak is dat .h-bestanden declaraties zijn en .cpp-bestanden definities.

Daarom zijn .h-bestanden #included — we nemen de declaraties mee.


Antwoord 2, autoriteit 39%

Het .cpp-bestand is de compilatie-eenheid: het is het echte broncodebestand dat wordt gecompileerd (in C++).

De .h (header)-bestanden zijn bestanden die virtueel worden gekopieerd en geplakt in de .cpp-bestanden waar de #include precompiler-instructie verschijnt. Zodra de headercode is ingevoegd in de .cpp-code, kan de compilatie van de .cpp beginnen.


Antwoord 3, autoriteit 22%

Een headerbestand (.h, .hpp, …) bevat

  • Klassedefinities ( class X { ... };)
  • Inline functiedefinities ( inline int get_cpus() { ... })
  • Functieverklaringen ( void help();)
  • Objectdeclaraties ( extern int debug_enabled;)

Een bronbestand (.c, .cpp, .cxx) bevat

  • Functiedefinities ( void help() { ... }of void X::f() { ... })
  • Objectdefinities ( int debug_enabled = 1;)

Echter, de afspraak dat headers een naam krijgen met een .h-achtervoegsel en bronbestanden een naam krijgen met een .cpp-achtervoegsel is niet echt vereist. Men kan een goede compiler altijd vertellen hoe een bestand moet worden behandeld, ongeacht het achtervoegsel van de bestandsnaam ( -x <file-type>voor gcc. Zoals -x c++).

Bronbestanden zullen definities bevatten die maar één keer in het hele programma mogen voorkomen. Dus als je ergens een bronbestand opneemt en dan het resultaat van de compilatie van dat bestand en dan dat van het bronbestand zelf aan elkaar koppelt, dan krijg je natuurlijk linkerfouten, want die definities komen nu twee keer voor: Eenmaal in de opgenomen bronbestand en vervolgens in het bestand waarin het is opgenomen. Daarom had je problemen met het opnemen van het bestand .cpp.


Antwoord 4, autoriteit 19%

.h-bestanden, of header-bestanden, worden gebruikt om de openbaar toegankelijke instantievariabelen en -methoden in de klassendeclaratie weer te geven. .cpp-bestanden, of implementatiebestanden, worden gebruikt om die methoden daadwerkelijk te implementeren en die instantievariabelen te gebruiken.

De reden dat ze gescheiden zijn, is omdat .h-bestanden niet in binaire code worden gecompileerd, terwijl .cpp-bestanden dat wel zijn. Neem bijvoorbeeld een bibliotheek. Stel dat u de auteur bent en niet wilt dat het open source is. U distribueert dus de gecompileerde binaire bibliotheek en de headerbestanden naar uw klanten. Hierdoor kunnen ze gemakkelijk alle informatie zien over de klassen van je bibliotheek die ze kunnen gebruiken zonder te kunnen zien hoe je die methoden hebt geïmplementeerd. Ze zijn meer voor de mensen die uw code gebruiken dan voor de compiler. Zoals eerder gezegd: het is de conventie.


Antwoord 5, autoriteit 17%

Ik ken het verschil tussen een verklaring en een definitie.

Terwijl:

  • Een CPP-bestand bevat de definities van elke header die het bevat (omdat CPP en headerbestand samen één ‘vertaaleenheid’ vormen)
  • Een headerbestand kan worden opgenomen in meer dan één CPP-bestand
  • De linker houdt doorgaans niet van iets dat in meer dan één CPP-bestand is gedefinieerd

Daarom moeten alle definities in een headerbestand inline of statisch zijn. Headerbestanden bevatten ook declaraties die door meer dan één CPP-bestand worden gebruikt.

Definities die niet statisch of inline zijn, worden in CPP-bestanden geplaatst. Ook worden declaraties die alleen binnen één CPP-bestand nodig zijn, vaak in dat CPP-bestand zelf geplaatst, in plaats van in een (deelbaar) headerbestand.


Antwoord 6, autoriteit 4%

Een goede vuistregel is: “.h-bestanden moeten verklaringen bevatten die [mogelijk] door meerdere bronbestanden worden gebruikt, maar geen code die wordt uitgevoerd.”


Antwoord 7, autoriteit 3%

Anderen hebben al een goede uitleg gegeven, maar ik dacht dat ik de verschillen tussen de verschillende extensies moest verduidelijken:

Bronbestanden voor C: .c
 Headerbestanden voor C: .h
 Bronbestanden voor C++: .cpp
 Headerbestanden voor C++: .hpp

Natuurlijk, zoals al is opgemerkt, zijn dit slechts conventies. De compiler besteedt er eigenlijk geen aandacht aan – het is puur in het voordeel van de codeur.


Antwoord 8

Volgens afspraak worden .h-bestanden opgenomen in andere bestanden en nooit rechtstreeks door zichzelf gecompileerd. .cpp-bestanden zijn – nogmaals, volgens afspraak – de wortels van het compilatieproces; ze bevatten direct of indirect .h-bestanden, maar over het algemeen geen .cpp-bestanden.

Other episodes