
なぜ、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 がついているわけです。
No.4
- 回答日時:
歴史的経緯は既に説明があるので実際的な部分を少し。
そもそも#includeディレクティブは「指定されたファイルをコード中に展開する」という意味を持つだけなので拡張子とかは関係なくファイルならなんでも指定できます。
#もちろん展開後にソースコードの体をなしていなければコンパイルでエラーになりますが。
#また標準ヘッダは処理系によって違う挙動があるかもしれない、というのは既に出ている通りです。
拡張子が.hなのはCの頃からの慣習に過ぎず、そのCでも.h以外のファイルをインクルードできます。
ファイルを眺めた時に「これはヘッダ」と一目瞭然になることやファイル検索が容易になることから、なるべく統一した拡張子を付ける癖は持っておいた方がいいと思いますが。
回答ありがとうございます。
拡張子はもともとなくても問題なかったんですね。
もちろん自作するときは付けるべきなんでしょうが。
理解が深まりました。
No.2
- 回答日時:
>そもそもiostreamなどは拡張子をもっているのですか?
http://www.02.246.ne.jp/~torutk/cxx/file/header. …
ヘッダファイルとは
ヘッダファイルのファイル名は何をつければよいでしょうか。
慣例では拡張子.hを使用します。しかし、C++標準ライブラリ
^^^^^^^^^^^^^^^^^
のヘッダファイルのように、拡張子がないものもあります。
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
>自分でヘッダーファイルを作る場合はどのようにすればいいのでしょうか?
標準ライブラリと混同しないように、拡張子を付けた方が
良いと思います。
また、""と<>を使い分ける事によっても、自作のヘッダファイルか
否かを区別します。
No.1
- 回答日時:
処理系を決めなければ, この問いに答えることは不可能です.
例えば
#include <iostream>
と書いたときにどうなるかは処理系による. 「iostream」という名前のファイルを読込むかもしれんし「iostream.ほげ」かもしれんし, さらには「そもそも『ファイル』など存在せずこの指令によって『定義されるべきもの』が定義されるようになっている」という可能性すら否定できない.
と, まあここまでは規格上の話. 現実的には「iostream」という名前のファイルを読込むのが普通でしょう.
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Chrome(クローム) Chromeでダウンロードしたファイルを拡張子ごとに取り扱い方法を変更できないんでしょうか? 2 2022/11/19 17:34
- C言語・C++・C# const char** p;のとき、free(p)でC4090エラーとなるのはなぜですか 3 2023/03/31 16:28
- Visual Basic(VBA) Excelのマクロについて教えてください。 作業フォルダ内に2つのファイルがあります。 このファイル 2 2023/07/09 13:40
- Excel(エクセル) マクロを作成し、拡張子 .xlsm で保存しているのですが、データのみをBack Upするのは? 4 2023/06/18 09:54
- その他(ソフトウェア) コマンドプロンプトについて教えてください。 状況: 画像編集ソフト上でネットから保存した画像を使うの 3 2022/05/26 11:14
- がん・心臓病・脳卒中 心臓の収縮、拡張について 2 2023/02/28 07:46
- Excel(エクセル) ドキュメントに保存していたエクセルのファイルが開きません。 2 2022/12/02 09:38
- Chrome(クローム) おすすめのGoogle Chromeの拡張機能 スクリーンショットをを教えてください 1 2022/05/18 19:56
- その他(セキュリティ) 添付されたファイルの*.pdf等の拡張子 2 2023/01/30 21:49
- その他(プログラミング・Web制作) Excel vbaでフォルダー内のpptをpptxにdocをdocxに変換 6 2022/09/01 21:03
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
今、見られている記事はコレ!
-
弁護士が語る「合法と違法を分けるオンラインカジノのシンプルな線引き」
「お金を賭けたら違法です」ーーこう答えたのは富士見坂法律事務所の井上義之弁護士。オンラインカジノが違法となるかどうかの基準は、このように非常にシンプルである。しかし2025年にはいって、違法賭博事件が相次...
-
釣りと密漁の違いは?知らなかったでは済まされない?事前にできることは?
知らなかったでは済まされないのが法律の世界であるが、全てを知ってから何かをするには少々手間がかかるし、最悪始めることすらできずに終わってしまうこともあり得る。教えてgooでも「釣りと密漁の境目はどこです...
-
カスハラとクレームの違いは?カスハラの法的責任は?企業がとるべき対応は?
東京都が、客からの迷惑行為などを称した「カスタマーハラスメント」、いわゆる「カスハラ」の防止を目的とした条例を、全国で初めて成立させた。条例に罰則はなく、2025年4月1日から施行される。 この動きは自治体...
-
なぜ批判コメントをするの?その心理と向き合い方をカウンセラーにきいた!
今や生活に必要不可欠となったインターネット。手軽に情報を得られるだけでなく、ネットを介したコミュニケーションも一般的となった。それと同時に顕在化しているのが、他者に対する辛らつな意見だ。ネットニュース...
-
大麻の使用罪がなかった理由や法改正での変更点、他国との違いを弁護士が解説
ドイツで2024年4月に大麻が合法化され、その2ヶ月後にサッカーEURO2024が行われた。その際、ドイツ警察は大会運営における治安維持の一つの方針として「アルコールを飲んでいるグループと、大麻を吸っているグループ...
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
C言語のポインターで詰まっている
-
ユークリッドの除去法アルゴリズム
-
VC++で文字列から任意の文字を...
-
修正箇所の指摘のお願い(文字列...
-
#define中の#のエスケープ
-
ヘッダーファイルがインクルー...
-
Pascalへの変換について
-
std::wstringのメモリリークに...
-
JPEGやPNGが読めるLoadImage関数
-
C++でのmath.hやstdio.hの使用...
-
C++で2次元配列charをループしたい
-
clock関数のコンパイルエラーで
-
このプログラミング誰か教えて...
-
shared_ptr クラスについて
-
C++のifstreamの使い方
-
2重の(?)の#include
-
C言語 ストリームについて。
-
C++での <iostream.h>と<iostre...
-
C言語
-
DLLでダイアログ
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VC++で文字列から任意の文字を...
-
なぜ、C++の標準ヘッダをインク...
-
構文エラーが出ているのですが...
-
enumの値から定義名を文字列化...
-
JPEGやPNGが読めるLoadImage関数
-
std::map の const 修飾について
-
VS2019でofstreamが未定義になる
-
_tcscat がうまくいきません(V...
-
空ENTERの判別
-
構造体配列のvectorへの変換と...
-
switch文のエラーについて
-
std::wstringのメモリリークに...
-
#define中の#のエスケープ
-
C++でShowCursorを使いたい。
-
findnext();について
-
【C++】ヘッダ内でstringを格納...
-
#include "fstream.h"
-
CStringとString
-
#defineの使い方について
-
iostream インクルード時に発生...
おすすめ情報