dポイントプレゼントキャンペーン実施中!

なぜ、C++の標準ヘッダをインクルードするとき拡張子をつけないのか。
そもそもiostreamなどは拡張子をもっているのですか?
拡張子はあるけれどインクルードするときに付けてないだけとか?だとしたら、同じファイル名で拡張子の違いで判別できないですよね?a.hとa.hppがあったら#include <a>じゃわからないって意味。
自分でヘッダーファイルを作る場合はどのようにすればいいのでしょうか?
自分で作ったヘッダーファイルも標準ヘッダの様に拡張子を付けないでインクルードすることができますか?そういった事はするべきではないのでしょうか?
この拡張子をつけないというのはC++の標準ヘッダだけ特別仕様とか?
Cと同じように.hでヘッダーファイル作って#include "a.h"とかにしておけばいいのかなー??

詳しい方、わかりやすく説明して頂けないでしょうか。よろしくお願いします。

A 回答 (4件)

本来は、No.1 のご回答の通り、include をどう動かすかは「処理系依存」です。


ついでにいえば、ヘッダファイルが .h なのは、これまた、昔からみんなそうしてきたというだけで、そうでなければならないものではありません。

さて、C++ の標準ヘッダをインクルードするとき、.h がつかないのは、namespace の導入によるつじつま合わせです。

かつては、C++ でも、 #include <iostream.h> とかしていましたし、実際には今でもできます。
C++ の標準が、2003年に大きく変わったときに、
・namespace という概念を導入しよう
・標準関数は、すべて、 std という namespace に含まれることにしよう
ということが決まりました。

このため、たとえば、cout という標準出力も、namespace std の中に含まれるので、

std::cout << "Hello";

とか

using namespace std;
cout << "Hello";

とかするようになりました。

そうすると困るのは、2003年の標準以前に作られたプログラムです。
こういうプログラムは、(namespace などないので)

#include <iostream.h>
cout << "Hello";

とか平気で書かれています。namespace 指定がされてないので、これはエラーになるはずですが、これをエラーにしてしまうと、それまで書かれた大量のプログラムが困ったことになります。
ここで、「だったら、include するファイル指定を使い分ければいいじゃないか」
ということで、namespace に対応した以降のものは、iostream.h じゃなくて、iostream をインクルードしようと、そうなったのでした。

C++の標準ヘッダは、このように、.h なし できまりましたが、Cの時代から使われていた標準ヘッダ (stdio.h など)もあります。
これは、どうしようかということで、 C を頭につけて、.h なし。ということになりました。
stdio.h なら、cstdio です。

これには、2003年の改訂で std::string (標準ストリング)が導入されたというものの副作用です。
これにともない、C++に string という標準ヘッダが導入されました。
あ、これ、Cの時代から使っていた、string.h とかぶるし……。
というこで、Cの時代から使っていたのは、c をつけて、cstring C++で新たに導入されたのは、string となりました。

ですから、今でも、#include <iostream> じゃなくて、#include <iostream.h> は使用可能ですが、#include <string> の替わりに、#include<stding.h> とすると、別のもの(Cの時代のもの)がインクルードされてしまいます。

上記のように、.h なしヘッダは、「標準ヘッダのつじつま合わせ」のためのもなので、標準ヘッダ以外のものは今でも、.h や .hpp がついているわけです。
    • good
    • 7
この回答へのお礼

回答ありがとうございます。
とてもわかりやすい説明で納得できました。
こんな背景があったわけですね。

お礼日時:2010/08/28 12:56

歴史的経緯は既に説明があるので実際的な部分を少し。



そもそも#includeディレクティブは「指定されたファイルをコード中に展開する」という意味を持つだけなので拡張子とかは関係なくファイルならなんでも指定できます。
#もちろん展開後にソースコードの体をなしていなければコンパイルでエラーになりますが。
#また標準ヘッダは処理系によって違う挙動があるかもしれない、というのは既に出ている通りです。

拡張子が.hなのはCの頃からの慣習に過ぎず、そのCでも.h以外のファイルをインクルードできます。
ファイルを眺めた時に「これはヘッダ」と一目瞭然になることやファイル検索が容易になることから、なるべく統一した拡張子を付ける癖は持っておいた方がいいと思いますが。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
拡張子はもともとなくても問題なかったんですね。
もちろん自作するときは付けるべきなんでしょうが。
理解が深まりました。

お礼日時:2010/08/28 12:54

>そもそもiostreamなどは拡張子をもっているのですか?



http://www.02.246.ne.jp/~torutk/cxx/file/header. …
ヘッダファイルとは
ヘッダファイルのファイル名は何をつければよいでしょうか。
慣例では拡張子.hを使用します。しかし、C++標準ライブラリ
                   ^^^^^^^^^^^^^^^^^
のヘッダファイルのように、拡張子がないものもあります。
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

>自分でヘッダーファイルを作る場合はどのようにすればいいのでしょうか?
標準ライブラリと混同しないように、拡張子を付けた方が
良いと思います。
また、""と<>を使い分ける事によっても、自作のヘッダファイルか
否かを区別します。
    • good
    • 1
この回答へのお礼

回答ありがとうございます。
理解することができました。

お礼日時:2010/08/28 12:52

処理系を決めなければ, この問いに答えることは不可能です.


例えば
#include <iostream>
と書いたときにどうなるかは処理系による. 「iostream」という名前のファイルを読込むかもしれんし「iostream.ほげ」かもしれんし, さらには「そもそも『ファイル』など存在せずこの指令によって『定義されるべきもの』が定義されるようになっている」という可能性すら否定できない.
と, まあここまでは規格上の話. 現実的には「iostream」という名前のファイルを読込むのが普通でしょう.
    • good
    • 1
この回答へのお礼

わかりやすい説明ありがとうございます。
理解が深まりました。

お礼日時:2010/08/28 12:51

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!