Ultimo aggiornamento: 26 Feb, 2026

Titolo - .h vs .hpp: Qual è la differenza e quale dovresti usare?

Quando si scrivono programmi C++, soprattutto in progetti di grandi dimensioni, organizzare il codice in più file è fondamentale per la leggibilità e la manutenzione. Questo di solito comporta l’uso dei file di intestazione, che hanno le estensioni .h o .hpp. Ma qual è la differenza tra questi due e quale dovresti usare?

In questo articolo, analizzeremo le differenze tra i file .h e .hpp, ne esploreremo la storia e forniremo indicazioni sulle migliori pratiche.

Comprendere i file di intestazione in C++

I file di intestazione contengono dichiarazioni di funzioni, classi, costanti e macro che puoi includere in più file sorgente. Questi file vengono poi inclusi nei file .cpp (sorgente C++) tramite la direttiva #include.

Contenuti comuni dei file di intestazione

  • Definizioni di classi
  • Dichiarazioni di funzioni
  • Definizioni di costanti
  • Macro
  • Template (in alcuni casi)

File .h

Che cos’è un file .h?

I file .h sono i tradizionali file di intestazione e sono stati usati per la prima volta ampiamente nel linguaggio di programmazione C. Sono ancora utilizzati sia nei progetti C che C++ per dichiarare interfacce.

Esempio di utilizzo:

// mathutils.h
#ifndef MATHUTILS_H
#define MATHUTILS_H

int add(int a, int b);
int subtract(int a, int b);

#endif

Vantaggi:

  • Universalmente riconosciuti (usati sia in C che in C++).
  • Adatti a progetti che coinvolgono codice sia C che C++.

Svantaggi:

  • Può causare ambiguità nei progetti C++ su se il file è di stile C o C++.

File .hpp

Che cos’è un file .hpp?

I file .hpp sono file di intestazione specifici per C++. Funzionano allo stesso modo dei file .h ma sono usati per indicare esplicitamente che l’intestazione è destinata al codice C++.

Esempio di utilizzo:

// vectorutils.hpp
#ifndef VECTORUTILS_HPP
#define VECTORUTILS_HPP

#include <vector>

std::vector<int> filter_even(const std::vector<int>& input);

#endif

Vantaggi:

  • Indica chiaramente che il file è destinato al codice C++.
  • Evita confusione quando si mescolano C e C++.
  • Utile in progetti multilingua o in team che seguono convenzioni di denominazione rigorose.

Svantaggi:

  • Un po’ meno comune nei vecchi codebase.
  • Non riconosciuto da alcuni sistemi legacy che si aspettano .h.

.h vs .hpp: Differenze chiave

CaratteristicaFile .hFile .hpp
Associazione linguisticaC e C++Solo C++
Convenzione o Regola?ConvenzioneConvenzione
Uso nei progetti C++ComunePreferito da alcuni per chiarezza
Supporto ai template
Ambiguità del codicePossibile in progetti multilinguaMeno probabile

Best practice per scegliere tra .h e .hpp

Ecco alcune linee guida generali per aiutarti a scegliere:

Usa .h se:

  • Stai scrivendo codice che deve essere compatibile sia con C che con C++.
  • Stai mantenendo o estendendo codice legacy che già utilizza .h.

Usa .hpp se:

  • Vuoi rendere chiaro che il file è specifico per C++.
  • Stai lavorando in un progetto solo C++ o usi funzionalità specifiche di C++ come classi, template e namespace.

Strutture di progetto comuni

Esempio con .h:

project/
├── main.cpp
├── mathutils.h
└── mathutils.cpp

Esempio con .hpp:

project/
├── main.cpp
├── vectorutils.hpp
└── vectorutils.cpp

Entrambe le strutture sono valide; la differenza è principalmente nella chiarezza e nelle preferenze del team.

Conclusione

La scelta tra .h e .hpp è per lo più una questione di convenzione, non di funzionalità. Entrambi servono allo stesso scopo: dichiarare interfacce e codice condiviso tra più file sorgente C++.

Tuttavia, per codice specifico C++, usare .hpp può rendere le tue intenzioni più chiare e aiutare a evitare confusione in codebase più grandi—soprattutto quelli che coinvolgono più linguaggi. Per progetti multilingua o legacy, .h potrebbe ancora essere la scelta migliore.

Punto chiave:

Usa .hpp quando vuoi indicare “questo è solo codice C++” — resta con .h se lavori in ambienti che mescolano C e C++.

Vedi anche