C言語とC++のファイルの拡張子について

注意: この記事は1年以上前に掲載されたものです。情報が古い場合がありますのでお気を付け下さい。

C言語およびC++、およびそれに加えてObjective-CやObjective-C++ではマクロ展開 ((実際にコンパイルする前に特定の文字列を別の文字列に機械的に置き換える処理)) やインライン展開 ((コンパイル時に実際の処理を呼び出し元の部分に展開する処理。通常の関数の場合、特定の関数を呼ぶ場合、処理が関数の部分に移って処理を終えたら呼び出し元に戻るのだが、インライン展開の場合は呼び出し先の処理そのものがコンパイル時に呼び出し元に展開されるため、関数呼び出しのタイムラグがなくなる代わりに、コードサイズが肥大化する場合がある)) 基本的に宣言・定義部分と実装部分が分かれている。宣言・定義部分をヘッダーファイル、実装部分をソースファイルと呼ぶ。実際にはヘッダーファイルはインクルードされてソースファイルの一部として使われる。

ソースファイルは拡張子で分かれているが

ところで、C言語およびC++のソースコードファイルは通常、以下のように使い分けられている。

ソースファイルの言語 拡張子名
C言語 .c
c++ .cpp, .cc, .cxx, .c++, .cc ((通常は.cppや.ccが多い))
Objective-C .m
Objective-C++ .mm

これによって、ソースコードのファイルは通常、拡張子とその言語のソースコードの意味が分かれば、間違えることはほとんどないだろう。

ヘッダーファイルの拡張子は通常、.hが使われる

一方、ヘッダーファイルでは以下のように分かれている。

拡張子名 ヘッダーファイルの言語
.h C言語、C++、Objective-C、Objective-C++
(拡張子なし) C++、Objective-C++
.hpp C++、Objective-C++

うち、よく利用されているのは.hである。拡張子のないヘッダーファイルは現在のC++標準ライブラリー ((以前は.hだったが、namespaceの導入を機に現在の形に変更された)) で、.hppではBoostライブラリーで採用されていることが知られているが、他においてはあまり見られない。そのため、拡張子のないヘッダーファイル、あるいは.hppについてはC++あるいはObjective-C++のヘッダーファイルのどちらかであることがわかるが、.hの場合はC言語のヘッダーファイルなのか、C++のヘッダーファイルなのか、あるいはObjective-Cなのか、Objective-C++なのかは内容を見ないとわからない。

なぜ.hが使われ続けているのか

これにはC言語およびその派生言語の成立過程が考えられる。C++、Objective-C、Objective-C++はいずれもC言語の拡張によって成立したものであり、C言語との互換性がある程度 ((Objective-Cはほぼ完全に)) 確保されている。それによる慣習としてこれたの言語のヘッダーファイルの拡張子として.hが使われ続けたものと考えられる。

最後に

C言語では他のメジャーな言語とは大きく違う特徴がある。ヘッダーファイルもそのひとつだが、その拡張子でも人によっては興味深いところを見出せる。その時、「なぜそうなのか」を考えてみたいところである。

タイトルとURLをコピーしました