最終更新日: 2026年2月26日

C++ プログラムを書く際、特に大規模なプロジェクトでは、コードを複数のファイルに分割して整理することが可読性と保守性のために不可欠です。通常、ヘッダーファイルを使用し、拡張子は .h または .hpp です。この二つの違いは何か、どちらを使用すべきかを見ていきましょう。
この記事では、.h と .hpp ファイルの違いを詳しく解説し、その歴史を探り、ベストプラクティスに関する指針を提供します。
C++ におけるヘッダーファイルの理解
ヘッダーファイルは、関数、クラス、定数、マクロの 宣言 を含み、複数のソースファイルでインクルードできます。これらのファイルは、#include ディレクティブを使用して .cpp(C++ ソース)ファイルに取り込まれます。
ヘッダーファイルに一般的に含まれる内容
- クラス定義
- 関数宣言
- 定数定義
- マクロ
- テンプレート(場合によっては)
.h ファイル
.h ファイルとは?
.h ファイルは従来の ヘッダーファイル で、最初は C 言語で広く使用されました。現在でも C と C++ の両方のプロジェクトでインターフェース宣言に使用されています。
使用例:
// mathutils.h
#ifndef MATHUTILS_H
#define MATHUTILS_H
int add(int a, int b);
int subtract(int a, int b);
#endif
長所:
- C と C++ の両方で使用されており、普遍的に認識されている。
- C と C++ のコードが混在するプロジェクトに適している。
短所:
- C++ プロジェクトで、ファイルが C スタイルか C++ スタイルかの曖昧さを招く可能性がある。
.hpp ファイル
.hpp ファイルとは?
.hpp ファイルは C++ 専用のヘッダーファイルです。.h ファイルと同様に機能しますが、ヘッダーが C++ 用であることを 明示的に示す ために使用されます。
使用例:
// vectorutils.hpp
#ifndef VECTORUTILS_HPP
#define VECTORUTILS_HPP
#include <vector>
std::vector<int> filter_even(const std::vector<int>& input);
#endif
長所:
- ファイルが C++ 用であることを明確に示す。
- C と C++ を混在させる際の混乱を防ぐ。
- 混合言語プロジェクトや厳格な命名規則を採用しているチームに有用。
短所:
- 古いコードベースではやや一般的でない。
.hを期待する一部のレガシーシステムでは認識されないことがある。
.h と .hpp の主な違い
| 機能 | .h ファイル | .hpp ファイル |
|---|---|---|
| 言語の関連付け | C と C++ | C++ のみ |
| 慣例または規則? | 慣例 | 慣例 |
| C++ プロジェクトでの使用 | 一般的 | 明確さのために一部で推奨 |
| テンプレートサポート | あり | あり |
| コードの曖昧さ | 混合言語プロジェクトで発生する可能性あり | 起こりにくい |
.h と .hpp の選択に関するベストプラクティス
以下は選択のための一般的なガイドラインです:
.h を使用すべき場合:
- C と C++ の両方と互換性が必要なコードを書く場合。
- 既に
.hが使用されているレガシーコードを保守・拡張する場合。
.hpp を使用すべき場合:
- ファイルが C++ 専用であることを明確にしたい場合。
- C++ のみのプロジェクトで作業する、またはクラス、テンプレート、名前空間など C++ 固有の機能を使用する場合。
一般的なプロジェクト構成例
.h を使用した例:
project/
├── main.cpp
├── mathutils.h
└── mathutils.cpp
.hpp を使用した例:
project/
├── main.cpp
├── vectorutils.hpp
└── vectorutils.cpp
どちらの構成も有効です。違いは主に可読性とチームの好みにあります。
結論
.h と .hpp の選択は、機能ではなく主に 慣例 の問題です。どちらも同じ目的、すなわち複数の C++ ソースファイル間でインターフェースや共有コードを宣言するために使用されます。
ただし、C++ 専用のコードでは .hpp を使用することで意図が明確になり、特に複数言語が混在する大規模なコードベースでの混乱を防げます。混合言語やレガシーなプロジェクトでは、.h が依然として適切な場合があります。
主なポイント:
「このコードは C++ のみ」と示したい場合は
.hppを使用し、C と C++ が混在する環境で作業する場合は.hを使用してください。