これは何?
C++ で使うファイルの拡張子をどうすればいいのかの話を、軽く調べた結果とともに私見を書いた。
そもそも
そもそも、C++ のソースコードの拡張子に決まりは無い。
あるのは慣習だけ。
ソースコードは C++ だとわかる拡張子が使われる。
ヘッダファイルは C++ だとわかる拡張子か、C言語のヘッダと同じ拡張子が使われる。
ヘッダファイルで C言語のヘッダと同じ拡張子が使われるのは
- C / C++ のどちらでも使えるヘッダがあるから
- ヘッダの拡張子は、コンパイラに「このソースは C じゃなくて C++ だよ」と教えるための情報として役に立たないので区別する必要があまりないから(昔はエディタが賢くなかった)
という2つの理由から「Cと同じでいいや」という判断をしたんだと思う。
今はエディタに「このファイルは C じゃなくて C++ だよ」と教えるヒントとして役に立つので *.h
じゃないほうが便利かもね。
拡張子
よく使われていると思っているものを未調査の段階で書いてみると
拡張子 | 使われ方 |
---|---|
.cpp , .cc , .cxx
|
ソースコード。コンパイルの対象。 |
.h , hpp , .hh , .hxx
|
ヘッダファイル。インクルードされる。 |
.inl |
インライン関数の定義。マイクロソフトさんのプロジェクトなどで散見される。 |
拡張子なし | ヘッダファイル。標準ライブラリで使われる。 |
あたりを見かける。
GitHub を眺めてみると、他にも
-
.c++
ソースコードだよね -
.h++
ヘッダだよね -
.ipp
C++ のモジュールらしい -
.ixx
微妙に C++ じゃない気もする -
.tcc
テンプレートの定義かな -
.tpp
テンプレートの定義かな
といろいろある。
利用者の例
軽く調べた。
利用者 | ソース | ヘッダ |
---|---|---|
boost / filesystem | .cpp |
.hpp |
cppwinrt | .cpp |
.h |
gtest | .cc |
.h |
OpenCV | .cpp |
.h |
※ 上記は例えば「boost に .cpp
と .hpp
があったよ」ということで、全部そうだったということではない。
という具合で、文化圏によって色々ある。
使い分け
以下は私見。
ソースコード
自分で(あるいはチームで)書くソースコードは一貫して .cpp
にするとか、 .cc
にするとか、そういう感じがいいと思う。
サードパーティのソースコードが参加すると入り乱れることになるわけだけど、それは諦めるのが良い。
ヘッダ
ヘッダファイルには、普通の使われ方と異常な使われ方がある。
普通の使われ方
普通の使われ方っていうのは
- ファイルの冒頭付近で インクルードされることが想定されている
- インクルードすると 定数関数クラスあるいはテンプレートの定義が導入される
というやつ。
普通の使われ方のものには一貫して .h
にするとか、 .hxx
にするとか、そういう感じがいいと思う。ソースコード側と対になるのが良さそう。
異常な使われ方
異常な使われ方っていうのは、例えば
に書いたようなやつ。他にも邪悪な使い方はたくさんあるけれど
- ファイルの冒頭付近で普通に インクルードするとコンパイルエラーになりがち
- インクルードすると 定義の導入 以外のなにかが起こる
という感じのものが、異常な使われ方を想定しているヘッダファイル。
冒頭にいれるわけではないので「ヘッダ」という呼び名自体が不適切で「インクルードされるファイル」という名前が適切かと思う。
こういう輩には、ひと目見て「あ、いつものヘッダとなんか違う」とわかるような名前をつけたい。
なので拡張子は
- 邪悪さが軽微であれば、C++ のヘッダとして使われることがあるけどチーム内ではふつう使わないもの
- 邪悪さが深刻であれば、C++ のヘッダではないもの
というのがおすすめ。前述の記事の内容なら私の中では軽微なので、チーム内が .hh
なら .hxx
をつけるとか、それぐらいにする。
テンプレート用とかインライン用とか
マイクロソフトさんはインライン用に .inl
を使ったりするようだけど、私は使い分けるメリットはあまりないと思っている。
例えば テンプレートの宣言と定義を分けたければ
hoge_decl.hpp
で宣言、hoge_def.hpp
で定義、のようにファイル名で伝えればいいと思っている。
とはいえ、それぞれの文化や背景に合わせてお好みで。
まとめ
- C++ のソースコード・ヘッダファイルの拡張子には色々あるよ
- 普通のヘッダである限り、用途ごとに拡張子を変える必要はないと思うよ(そうしてもいいけどお好みで)
- 異常なヘッダファイルの場合には異常性をアピールするために拡張子を変えるのがおすすめだよ