C++を用いた開発を進める際、最初に直面する疑問の一つが「どの拡張子を使用すべきか」という点です。
C++には .cpp や .h 以外にも、.cc、.hpp、.cxx など多種多様な拡張子が存在します。
これらは基本的にコンパイラに対して「このファイルはC++のソースコードである」と伝える役割を持ちますが、プロジェクトの規模や開発環境、チームの慣習によって最適な選択が異なります。
本記事では、C++で使われる主要な拡張子の違いから、最新のC++20規格で登場したモジュール用拡張子、そして現場で推奨される使い分けのガイドラインまでを詳しく解説します。
C++における拡張子の重要性と基本的な役割
C++のソースコードを記述するファイルには、大きく分けて「ソースファイル」と「ヘッダーファイル」の2種類があります。
これらを適切に区別し、一貫性のある拡張子を付与することは、ビルドプロセスの効率化やコードの可読性向上において非常に重要です。
コンパイラ(GCC、Clang、MSVCなど)は、ファイルの拡張子を見てそのファイルがどのような言語(CなのかC++なのか)で書かれているかを判断します。
例えば、.c はC言語として、.cpp はC++として処理されるのが一般的です。
誤った拡張子を使用すると、C++特有の機能(クラスやテンプレートなど)がコンパイルエラーになったり、リンカが正しく動作しなかったりする原因となります。
また、大規模なプロジェクトでは複数の開発者が関わるため、「どの拡張子が何を意味するか」を統一しておくことで、メンテナンスコストを大幅に削減できます。
ソースファイルの拡張子:.cpp / .cc / .cxx / .c++
ソースファイルは、実際のプログラムのロジックを記述するファイルです。
コンパイルの対象となる「翻訳単位」を形成します。
.cpp
C++において最も一般的で、標準的な拡張子が .cpp です。
Windows環境のVisual Studio(MSVC)でデフォルトとして採用されているほか、LinuxやmacOSなどプラットフォームを問わず広く利用されています。
特にこだわりがない場合や、新規プロジェクトを開始する場合は、この .cpp を選択するのが最も安全です。
.cc
.cc は、主にUNIX系環境やGoogleのC++スタイルガイドなどで推奨されている拡張子です。
オープンソースプロジェクトや、クロスプラットフォーム開発を行うチームでよく見られます。
機能的には .cpp と全く変わりませんが、GCC(GNU Compiler Collection)を利用する開発者の間では伝統的に好まれる傾向にあります。
.cxx と .c++
.cxx は、C++の「+」記号がファイル名として扱いにくかった古いファイルシステムの制約から生まれたものです。
現在でも一部のツールキット(QtやVTKなど)に関連するコードで見かけることがありますが、新規に採用されるケースは減っています。
.c++ も同様の理由で存在しますが、一部のオペレーティングシステムではファイル名に「+」を使用できない、あるいはコマンドラインでの扱いに注意が必要なため、現在はほとんど推奨されません。
ヘッダーファイルの拡張子:.h / .hpp / .hh / .hxx
ヘッダーファイルは、クラスの定義や関数のプロトタイプ宣言、マクロ定義などを記述し、複数のソースファイルから共有するために使用されます。
.h
もともとC言語で使われていた拡張子ですが、C++でも依然として主流です。
CとC++が混在するプロジェクトや、C言語からも呼び出せるAPIを定義する場合には、.h を使用するのが一般的です。
ただし、プロジェクトが純粋にC++のみで構成されている場合、C言語のヘッダーと区別がつかなくなるというデメリットもあります。
.hpp
C++専用のヘッダーファイルであることを明示するために使われるのが .hpp です。
「Header Plus Plus」の略であり、この拡張子を使うことで、そのファイルがC++特有の機能(テンプレートや名前空間など)を含んでいることを開発者に直感的に伝えることができます。
また、エディタのシンタックスハイライトがC++として正しく適用されやすいというメリットもあります。
.hh と .hxx
これらはソースファイルの .cc や .cxx に対応するヘッダー用拡張子です。
.hh はUNIX系の慣習で使われることが多く、.hxx は特定のライブラリとの整合性を保つために選ばれることがあります。
| 拡張子 | 用途 | 主な使用環境・特徴 |
|---|---|---|
| .cpp | ソース | C++の標準的な拡張子。OSを問わず推奨。 |
| .cc | ソース | UNIX/Linux環境やGoogleスタイルで一般的。 |
| .cxx | ソース | 古いシステムや特定のツール(Qtなど)で利用。 |
| .h | ヘッダー | C/C++共用。最も汎用的だが言語の区別が曖昧。 |
| .hpp | ヘッダー | C++専用であることを明示。モダンな開発で推奨。 |
| .hh | ヘッダー | UNIX系。ソースが .cc の場合に合わせることが多い。 |
C++20から登場したモジュール用の拡張子:.ixx / .cppm
C++20規格では、従来のヘッダーファイルによるインクルード方式の欠点を解消するために「モジュール(Modules)」という仕組みが導入されました。
これに伴い、新しい拡張子が登場しています。
.ixx (MSVC専用)
Microsoft Visual Studioでは、モジュールインターフェースファイルとして .ixx を使用します。
このファイル内で export module my_module; のように宣言することで、他のファイルからインポート可能なモジュールを定義します。
.cppm (Clang / GCC)
ClangやGCCといったコンパイラでは、モジュールインターフェースの拡張子として .cppm が一般的に利用されます。
ただし、モジュールは比較的新しい機能であるため、コンパイラやビルドシステム(CMakeなど)の設定によって認識される拡張子が異なる場合がある点に注意が必要です。
モジュールを採用する場合、従来の .h / .cpp の構成とはビルドフローが大きく変わるため、プロジェクト全体での統一した設計が求められます。
テンプレートやインライン関数用の拡張子:.tpp / .inl
特定の用途に特化した拡張子を使用することで、コードの構造をより整理することができます。
.tpp (Template Implementation)
C++のテンプレートは、宣言と実装の両方がヘッダーファイルに含まれている必要があります。
しかし、実装が長大になるとヘッダーの見通しが悪くなります。
そこで、実装部分だけを別ファイルに切り出し、拡張子を .tpp として保存する手法があります。
このファイルはコンパイル単位にはならず、ヘッダーファイルの末尾でインクルードして使用します。
.inl (Inline Functions)
インライン関数の定義を別ファイルに分ける際に使われるのが .inl です。
これも .tpp と同様に、ヘッダーファイルをスッキリさせるためのテクニックとして利用されます。
拡張子の使い分けと推奨される命名規則
プロジェクトを円滑に進めるためには、どの拡張子を使うかという「ルール」を事前に決めておくことが不可欠です。
以下に、現代的な開発における推奨パターンをいくつか紹介します。
1. 標準的なモダンC++プロジェクト
最も推奨される組み合わせは、ソースファイルに .cpp、ヘッダーファイルに .hpp を使用する構成です。
この構成には以下のメリットがあります。
- C言語のファイルと明確に区別できる。
- ほとんどのIDE(Visual Studio, Xcode, VS Code)で最適に動作する。
- 静的解析ツールなどがC++として正しく認識しやすい。
2. C言語との互換性を重視する場合
既存のCライブラリを拡張する場合や、組み込み開発などでC/C++を混在させる場合は、ソースファイルを .cpp、ヘッダーファイルを .h に統一するのが一般的です。
ただし、この場合はヘッダーファイル内で extern "C" などのリンケージ指定を適切に行う必要があります。
3. Googleスタイルなどの特定規約に従う場合
Google C++ Style Guideなど、特定の規約を採用しているプロジェクトでは、.cc と .h の組み合わせが指定されていることがあります。
既存の規約がある場合は、それに従うのが鉄則です。
命名に関する注意点
拡張子だけでなく、ファイル名自体にも注意を払いましょう。
C++では大文字と小文字を区別するOS(Linuxなど)と区別しないOS(Windows)が存在するため、すべて小文字で統一するのが最もトラブルの少ない方法です。
また、スペースを含めることは避け、単語の区切りにはアンダースコア _ やハイフン - を使用しましょう。
まとめ
C++の拡張子には長い歴史があり、それぞれの名称には誕生した背景や文化的な理由があります。
現在、新規でプロジェクトを立ち上げるのであれば、ソースファイルには .cpp、ヘッダーファイルには .hpp を選択するのが最も標準的で確実な選択肢です。
しかし、最も重要なのは「どの拡張子を選ぶか」そのものよりも、「プロジェクト内でルールを統一し、一貫性を保つこと」にあります。
チーム開発においては、あらかじめコーディング規約で拡張子を定義しておき、混乱を防ぐようにしましょう。
また、C++20以降のモジュール化の流れにより、今後 .ixx や .cppm といった新しい拡張子の利用シーンも増えていくことが予想されます。
常に最新の言語仕様と、自身の開発環境(コンパイラ・ビルドツール)の対応状況を把握しておくことが、プロフェッショナルなC++開発への第一歩となります。






