なぜ、C++の標準ヘッダをインクルードするとき拡張子をつけないのか。

このQ&Aのポイント
  • C++の標準ヘッダをインクルードするとき、なぜ拡張子をつけないのでしょうか。
  • C++の標準ヘッダは拡張子を持っていますか?
  • 自分で作ったヘッダーファイルも標準ヘッダのように拡張子を付けないでインクルードすることはできるのでしょうか?
回答を見る
  • ベストアンサー

なぜ、C++の標準ヘッダをインクルードするとき拡張子をつけないのか。

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

質問者が選んだベストアンサー

  • ベストアンサー
回答No.3

本来は、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 がついているわけです。

yozakura20
質問者

お礼

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

その他の回答 (3)

  • D-Matsu
  • ベストアンサー率45% (1080/2394)
回答No.4

歴史的経緯は既に説明があるので実際的な部分を少し。 そもそも#includeディレクティブは「指定されたファイルをコード中に展開する」という意味を持つだけなので拡張子とかは関係なくファイルならなんでも指定できます。 #もちろん展開後にソースコードの体をなしていなければコンパイルでエラーになりますが。 #また標準ヘッダは処理系によって違う挙動があるかもしれない、というのは既に出ている通りです。 拡張子が.hなのはCの頃からの慣習に過ぎず、そのCでも.h以外のファイルをインクルードできます。 ファイルを眺めた時に「これはヘッダ」と一目瞭然になることやファイル検索が容易になることから、なるべく統一した拡張子を付ける癖は持っておいた方がいいと思いますが。

yozakura20
質問者

お礼

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

  • don_go
  • ベストアンサー率31% (336/1059)
回答No.2

>そもそもiostreamなどは拡張子をもっているのですか? http://www.02.246.ne.jp/~torutk/cxx/file/header.html ヘッダファイルとは ヘッダファイルのファイル名は何をつければよいでしょうか。 慣例では拡張子.hを使用します。しかし、C++標準ライブラリ                    ^^^^^^^^^^^^^^^^^ のヘッダファイルのように、拡張子がないものもあります。 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ >自分でヘッダーファイルを作る場合はどのようにすればいいのでしょうか? 標準ライブラリと混同しないように、拡張子を付けた方が 良いと思います。 また、""と<>を使い分ける事によっても、自作のヘッダファイルか 否かを区別します。

yozakura20
質問者

お礼

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

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

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

yozakura20
質問者

お礼

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

関連するQ&A

  • 自作したヘッダファイルをインクルードするには

    自作したヘッダファイルをインクルードするには 自作したヘッダファイルを半角スペースを含むフォルダを指定する時、 何かエスケープシーケンス文字が必要でしたでしょうか?ド忘れしてしまいました… 例えば、Program Filesの直下に入れた自作ヘッダファイルa.h(まず考えられないとは思いますが…)を インクルードしたい時、 #include "C:\\Program Files\\a.h" でいいんですよね?

  • ヘッダファイルの2重のインクルードについて

    ある書物に「ヘッダファイルを複数回インクルードすると、それを”再定義”することによるエラーになる」と書いてありますたが、以下のようなヘッダファイルを作りそれを数回インクルードしても何ら異状が無くコンパイルできました。 math.h→ヘッダファイル名 #define max(a,b)  ((a)>(b)?(a):(b))→ヘッダファイルの内容 c ファイル #include<stdio.h> #include"math.h"←複数回インクルード #include"math.h"←複数回インクルード int main(void){ int x=1,y=2; printf("max(x,y)=%d\n",max(x,y)); return 0; } 環境としては、RedHat Linuxでviです。 何ゆえ、エラーにならないのか良く解りません。 宜しくお願いします。

  • C++のヘッダーについて

    C++のプログラミングをしています そこで出てきた問題なのですが・・・ class Aのヘッダファイルa.hをほかのcppファイルにインクルードすると、 error C4430: 型指定子がありません - int と仮定しました。メモ: C++ は int を既定値としてサポートしていません error C2146: 構文エラー : ';' が、識別子 'test' の前に必要です。 とほかのヘッダファイルでコンパイルエラーがでます ヘッダファイルをインクルードしたときのみこのエラーがでて困っています。 解決法や、ヒントになりそうな事例を知りませんでしょうか?

  • #include <Windows.h>というヘッダファイルについて

    お早う御座います。 Cの初心者です、宜しくお願いします。 「#include <Windows.h>」というヘッダファイルはどのようなプログラムを書いたときにincludeしてやる必要があるのでしょうか。 宜しくお願いします。

  • ヘッダのinclude順

    ヘッダにヘッダをincludeせず include順でカバーする場合と、 必要なヘッダはヘッダにincludeする という方法があると思いますが この違いはなんでしょうか? 上記の方法でも結局ヘッダの変更で影響のあるcppファイルは コンパイルする必要があるのでどちらも同じ気がするのですが 何か違い、あるいは推奨する理由はありますか?

  • ポインタによる包含&ヘッダにincludeしない、 場合でtemplateの定義に…

    class Bの宣言をしているヘッダ中で class A; を、前方宣言し、そのポインタだけを持たせ、ソースファイルのほうにclass Aの中身が分かるように、#includeして、ソースファイルに関数の実装やstatic変数の定義を書いていた、とします。 しかし、templateを使う関数についてはコンパイル時に解決できないといけないので、それだけはヘッダに持ってきました。 その時 includeが一切書かれていない、class Bのヘッダ内において class Aのメンバを参照するようなコードを書いたとき クラス外、クラス内、いずれに書いても 正常にコンパイルできました。 通常の関数では当然無理なので、もともとtemplateがコンパイル時解決を強要するものなのでそういう仕様にしててくれてると考えられますが 1.これは、C++の標準仕様でしょうか?それとも処理系依存でしょうか? あと、templateに関して 2.特殊化ならソースにかけるのは標準仕様でしょうか?それとも処理系依存でしょうか?

  • C++のhppファイルをCでinclude

    皆さんこんにちは。 C++で書かれたhppファイルを、 Cのプログラムの冒頭にてincludeしたいなと 思っているのですが、 そうゆう事って、ざっくり可能なものでしょうか? キーワードが悪いのか、 すっきりと、方針が見つけることができませんでした。 CでC++ファイルのincludeが可能な場合、 大体の方針など教えていただけるとありがたいです。

  • ヘッダーファイルのインクルード

    VC++6.0です。 ヘッダーファイルをincludeしていいかどうかは どのように決まるのでしょうか? classは、appとhogeの1種類があるとして、 app.h、app.cppとhoge.cpp、hoge.hの4つのファイルがあるとします。 1)appによるhogeのメンバの操作があって、その逆は無い場合 2)hogeもappのメンバを操作する場合 のそれぞれで教えてください。 最初、私は、そのclass内で別のclassのメンバ関数を 呼ぼうと呼ぶまいとincludeしてもかまわないと思っていました。 しかし、自分の作ったプログラムを検討したところ 1)の場合で、hogeのヘッダーに #include "app.h"と入れるとエラーになります。 hogeのcppファイルに#include "app.h"と入れてもエラーになります。

  • ヘッダのinclude LSI試食版

    はじめまして。 よろしくお願いします。 コンパイラー:LSI C-86 Ver.3.30 試食版 OS:Windows Me includeフォルダの中にあるヘッダ以外に 新しいヘッダnew.hを \lsic330c\INCLUDEフォルダの中にいれて 1.cというファイルで #include<new.h> としてみたのですが、 コンパイル時にlcc 1.cとしてみても 1.c 1: ファイル new.hがオープンできない(No such file or directory) というエラーがでてしまいます。 よろしくお願いします。

  • ヘッダーファイルでは、他のヘッダーファイルをインクルードできないのか

    Javaを仕事で使っています。 最近趣味でC++を始めました。色々形式の違いに戸惑っています。 C++では関数を宣言しなければならないので、クラス名と同じヘッダーファイルにそのクラスで使う関数を宣言して、それをインクルードしています。 そこで今、壁にぶちあたりました。 あるクラス(仮にFooとします)の関数で、他のクラス型(Hogeとします)を引数に取りたいので、ヘッダーファイルにそれを宣言しようとしているのですが、コンパイルエラーになってしまいます。 Foo.hは以下のような感じ。 #include Hoge.h 中略 GetHoge(Hoge hoge); コンパイルエラーでは error C2011: 'Hoge' : 'class' 型の再定義 などと言われます。 クラスとその同名のヘッダーファイル、という形式を変えずに 他のクラス型を引数にとる関数を作るには、どうしたらよいのでしょうか? C++に関しては全くの素人です。詳しい方、ご教示願います。

専門家に質問してみよう