どうでもいい質問なのですが…
C++で色々とソースを打っていると気づいたのです。
#include <iostream.h>とするとusing namespace std;の一文を書かなくてもコンパイルエラーになりません。
また、逆に#include <iostream>とするとusing namespace std;の一文が必要になります。
だから、h(ヘッダファイル)の.hは必要なのかな?と思い、#include <cstdlib.h>とするとコンパイルエラーになります。
なにか理屈がわかりません。コンパイラはVC++6.0です。よろしくご回答の方お願いいたします。
No.1ベストアンサー
- 回答日時:
完全な法則、理屈があるというよりも、歴史的経緯によるものです。
<iostream.h>は、namespace stdがまだ決まってなかった頃の名残、「古いヘッダ」です。
VC6は言語仕様が正式に固まるより古い代物なので、
<iostream.h>という過渡期の遺物がついてます。
この頃は、namespace stdがまだなかったので、
<iostream.h>内の関数はusingしなくても使えます。
但し、今の言語仕様ではnamespace stdが導入されてますので、
あくまで互換性のためのものと思います。
新規に書くなら<iostream>を使うべきです。
一方、<iostream>の方は現行言語仕様通りのヘッダです。
こちらは、namespace std内の定義に正しくなっているため、
namespaceを指定して使う必要があります。
using namespace std;や、using std::cout;の他、
std::cout << "foo";などもできますので、
必ずしもusing directiveやusing declarationが必要とは限りませんが。
少なくとも、ヘッダなどで *むやみに* usingはnamespaceの意義を損ない好ましくないと思います(使い方次第)。
> h(ヘッダファイル)の.hは必要なのかな?と思い、
ちなみに、C++としては、単にヘッダであり、ファイルとは限りません。
> #include <cstdlib.h>とするとコンパイルエラーになります。
「c…」なヘッダには原則、対応するC言語のヘッダがあります。
「c…」というヘッダは、そのC言語のヘッダのC++版であり、
もし<cstdlib.h>に相当するものがあるとすれば、それは単に<stdlib.h>です。
C言語にはnamespaceがありませんので、<stdlib.hにもnamespace stdはありません。
<iostream>はC言語にはない、C++独自のヘッダであり、
<cstdlib>はC言語の<stdlib.h>のC++版なので、そのような挙動の違いになります。
<cstdio>と<stdio.h>とか、<cstring>と<string.h>とか、
もともと対応するC言語のヘッダがあるものは「c…」という名前になってます。
丁寧な、ご回答ありがとうございます。
なるほど。<iostream.h>が使われてたころは、「namespace std」が言語仕様で存在しなかったのですね。質問の後、#include <iostream> using namespace std; としたら(.hをつけない)エラーになりました。どうもVC++6.0は、その仕様が決まる前のコンパイラみたいです。
現行の仕様は、おおむね最近の本に書いてあるとおりの書き方なんですね(あたりまえですが(;^^)) 私は、昔買った古い本で色々勉強しています。
尚、ご回答の最後の部分ですが、C++言語を使用している場合、C言語はサブセットとしてふくまれるとの本の記述がありましたが、まさにそのとおりですね。stdlib→cstdlibとかcを付け足しただけですね。
namespaceの使い方とかも色々ありそうですが、次第に勉強を重ね、最適な方法を見つけたいと思います。
どうもご丁寧な回答ありがとうございました。
No.2
- 回答日時:
すでに出ている回答でおおむね合っていますが、一部補足説明します。
C++では、<stdlib.h>のようなC互換のヘッダは、内部で<cstdlib>を包含しています。すなわち、<cstdlib>で宣言されるstd::absは、<stdlib.h>でもstd::absとして宣言され(すなわち、namespace stdがある)、その上で大域的名前空間でusing std::abs;が行われます。
ただし、これはあくまでも規格上のことであり、古い処理系であるVC++6.0では必ずしもそのようにはなっていません。
どうもありがとうございます。
単なるstd::の部分も色々な階層があるんですね。一応、Javaをかじっていたのでなんとなくはわかるのですが、まだC++の深い部分まで入っていけません。プロの方からいうと全然深くないかもしれませんが(;^_^
ご回答ありがとうございました。VC6のコンパイラだとちょっとまずいかもしれないので、新たにコンパイラを手に入れたいとおもいます。今はフリーで色々あるのでいいですね。ご回答ありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# C++初心者です stirng 2 2022/09/20 20:43
- C言語・C++・C# C++プログラミングコードにポリモーフィズムを取り入れ方を教えてください。 2 2023/06/09 11:17
- C言語・C++・C# C++のcinの動作 5 2023/02/26 00:13
- C言語・C++・C# メインプログラムに#include <algorithm>を書いて、 そのメインプログラムが // 3 2023/05/02 11:24
- C言語・C++・C# PC画面を録画するプログラムでdllの読み込みエラー 1 2023/04/22 08:31
- C言語・C++・C# Windows Formアプリからコンソールを呼び出して文字を出力させたい 8 2023/05/09 10:53
- C言語・C++・C# このプログラミング誰か教えてくれませんか 1 2022/06/02 15:27
- C言語・C++・C# C言語のエラーについて 2 2022/07/11 13:56
- C言語・C++・C# ExcelCS 1 2023/01/27 19:47
- C言語・C++・C# c言語 プログラムのエラー 1 2023/02/11 20:31
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
空ENTERの判別
-
enumの値から定義名を文字列化...
-
switch文のエラーについて
-
ハミング符号の解読について
-
_CRT_SECURE_NO_DEPRECATE が効...
-
C言語のポインターで詰まっている
-
unsigned char SJis[2]からstd:...
-
#include "fstream.h"
-
snprintfが使用できない。
-
CStringとString
-
C++で、テキストファイルを一行...
-
指定した文字を削除したい
-
mapの初期化
-
std::mapのメモリアロケータに...
-
C++でShowCursorを使いたい。
-
独立係数について教えて下さい。
-
Enterキーを押されたら次の処理...
-
信頼区間の1.96や1.65ってどこ...
-
2÷3などの余りについて
-
マイナスからプラスへ転じた時...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
switch文のエラーについて
-
構文エラーが出ているのですが...
-
VC++で文字列から任意の文字を...
-
enumの値から定義名を文字列化...
-
空ENTERの判別
-
C++でShowCursorを使いたい。
-
なぜ、C++の標準ヘッダをインク...
-
#define中の#のエスケープ
-
C++で、テキストファイルを一行...
-
gccでコンパイル時のエラー
-
C言語のエラーを修正したい
-
#include "fstream.h"
-
C言語のポインターで詰まっている
-
リモートデスクトップの接続元I...
-
構造体配列のvectorへの変換と...
-
JPEGやPNGが読めるLoadImage関数
-
VS2019でofstreamが未定義になる
-
構造体に決められた文字列を入...
-
VHDLのsignedとunsignedの違いは?
-
std::wstringのメモリリークに...
おすすめ情報