• ベストアンサー

C++での <iostream.h>と<iostream>とusingnamespaceの関係等を教えてください。

どうでもいい質問なのですが… C++で色々とソースを打っていると気づいたのです。 #include <iostream.h>とするとusing namespace std;の一文を書かなくてもコンパイルエラーになりません。 また、逆に#include <iostream>とするとusing namespace std;の一文が必要になります。 だから、h(ヘッダファイル)の.hは必要なのかな?と思い、#include <cstdlib.h>とするとコンパイルエラーになります。 なにか理屈がわかりません。コンパイラはVC++6.0です。よろしくご回答の方お願いいたします。

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

  • ベストアンサー
  • MrBan
  • ベストアンサー率53% (331/615)
回答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…」という名前になってます。

kamkamkam3
質問者

お礼

丁寧な、ご回答ありがとうございます。 なるほど。<iostream.h>が使われてたころは、「namespace std」が言語仕様で存在しなかったのですね。質問の後、#include <iostream> using namespace std; としたら(.hをつけない)エラーになりました。どうもVC++6.0は、その仕様が決まる前のコンパイラみたいです。 現行の仕様は、おおむね最近の本に書いてあるとおりの書き方なんですね(あたりまえですが(;^^)) 私は、昔買った古い本で色々勉強しています。 尚、ご回答の最後の部分ですが、C++言語を使用している場合、C言語はサブセットとしてふくまれるとの本の記述がありましたが、まさにそのとおりですね。stdlib→cstdlibとかcを付け足しただけですね。 namespaceの使い方とかも色々ありそうですが、次第に勉強を重ね、最適な方法を見つけたいと思います。 どうもご丁寧な回答ありがとうございました。

その他の回答 (1)

  • jacta
  • ベストアンサー率26% (845/3158)
回答No.2

すでに出ている回答でおおむね合っていますが、一部補足説明します。 C++では、<stdlib.h>のようなC互換のヘッダは、内部で<cstdlib>を包含しています。すなわち、<cstdlib>で宣言されるstd::absは、<stdlib.h>でもstd::absとして宣言され(すなわち、namespace stdがある)、その上で大域的名前空間でusing std::abs;が行われます。 ただし、これはあくまでも規格上のことであり、古い処理系であるVC++6.0では必ずしもそのようにはなっていません。

kamkamkam3
質問者

お礼

どうもありがとうございます。 単なるstd::の部分も色々な階層があるんですね。一応、Javaをかじっていたのでなんとなくはわかるのですが、まだC++の深い部分まで入っていけません。プロの方からいうと全然深くないかもしれませんが(;^_^ ご回答ありがとうございました。VC6のコンパイラだとちょっとまずいかもしれないので、新たにコンパイラを手に入れたいとおもいます。今はフリーで色々あるのでいいですね。ご回答ありがとうございました。

関連するQ&A

  • C++のソースに関する質問

    以下のコードをコンパイラのテスト目的でコンパイルしました //test.cpp #include <iostream> using namespace std; void main() { cout << "test" << endl; } 使っているコンパイラはBCC Developerと言うソフトです 上に書いているコードは間違っては居ないと思うのですが エラー E2266: ファイル名が指定されていない と言うエラーが出てきます、何処のファイルをどうやって 指定するのかを教えてください

  • エラー 'iostream.h' : No such file or directory

    当方VC++初心者です。3Dモーションセンサーを購入してその角度等の値をファイルに書き込みすることをしようとしています。 センサーに付属しているVC++用のサンプルプログラムをコンパイルしたところ、 fatal error C1083: include ファイルを開けません。'iostream.h' : No such file or directory というエラーが出ます。 #include <iostream.h>が関係していると思い、 #include <iostream>にしてみたり、#include <iostream.h>を消してコンパイルすると、エラーがたくさん出てくるので#include <iostream.h>に意味があると思われますが、そのくせ#include <iostream.h>というファイルがないというのはどういうことなのかよくわからず対処できずに困っています。 Microsoft Visual Studio .net 2003を使っています。

  • コンパイルできない・・。(VC++初心者です)

    VC++初心者です。 MS VC++6.0を使用しています。 プロジェクト(Win32 console application)を新規作成して,以下のソースファイル2つとヘッダファイル1つを作成して,コンパイルしたところ インクルード ファイルがオープンできません。'kneko.h': No such file or directoryとエラーが表示されます. 3つのファイルがリンクできてないのでしょうか? また,ヘッダファイルを選択,表示させてコンパイルしようとすると kneko.h の拡張子に関連したコンパイラツールがないためにコンパイルできないと警告されます。 どこが間違っているのでしょうか?よろしくおねがいします。 test.cpp ------------------------------------------------- #include <iostream> #include <cstdio> #include "kneko.h" using namespace std; int main(){ kneko x( "tama" ); x.naku(); } ------------------------------------------------- kneko.h ------------------------------------------------- #ifndef __kneko_h #define __kneko_h #include <iostream> #include <string> using namespace std; class kneko { string name; public: kneko(){}; kneko( string n ); void setname( string n ); void naku() const; }; #endif ------------------------------------------------- kneko.cpp ------------------------------------------------- #include "kneko.h" kneko::kneko( string n ){ name = n; } void kneko::setname( string n ){ name = n; } void kneko::naku() const { cout << "My name is " << name << "." << endl; } -------------------------------------------------

  • C++, strcpy の warning.

    VC2005 Express Edition を使ってます。 #include <iostream> #include <string> using namespace std; int main() {   char str[10] = "hello";   strcpy(str, "HELLO"); } ↑ こちらをコンパイルすると hello.cpp .\hello.cpp(8) : warning C4996: 'strcpy' was declared deprecated C:\Program Files\Microsoft Visual Studio 8\VC\include\string.h(73) : see declaration of 'strcpy' という警告が出るのはどうしてでしょうか? #include <string.h> も試したのですが同じ警告でした。

  • C++のnamespace stdについて

    C++のnamespace stdについて教えて下さい。 coutを使用する場合"iostream"をインクルードし、using namespaceでstd名前空間を使用します。 printfを使用する場合"cstdio"をインクルードし、using namespaceでstd名前空間を使用します。 どちらのインクルードファイルにもnamespace stdという風に同じ名前の名前空間を 使用しているのでしょうか? もしもそうだとしたらcstdio,iostreamの両方をインクルードしている場合 名前空間が競合してしまうのではないでしょうか? namespaceはjavaでいうパッケージにあたる物だと思っていたので、 これでは意味がないのではないかと思いました。 それとも意図的に同じ名前空間を定義している意味があるのでしょうか? C++を使い始めたばかりで戸惑っています。どなたかお答え頂ければありがたいです。

  • プログラミング言語Cとプログラミング言語C++

    プログラミング言語Cとプログラミング言語C++の違いって何ですか? あと、プログラミング言語C++についていくつか質問があります。 #include <iostream> using namespace std; void main(){ cout << "Hello world!" << endl; } このプログラムについて質問なんですが、iostreamってプログラミング言語Cで言うstdio.hのことですか? using namespace stdって何ですか? あと、 cout <<"Hello world!"って何ですか?

  • コンパイラの制限 : ヒープの領域を使い果たしました

    最近、標準C++の勉強を始めたばかりなのですが、以前にC++で書いたプログラムのヘッダを標準C++に変更して(例えば、#include<iostream.h>を#include<iostream>に変える)コンパイルしたところ、 「コンパイラの制限 : ヒープの領域を使い果たしました; 上限を設定するために /Zm オプションを使用してください。」とのエラーがでました。このエラーは以前は出なかったもので、以前も今回もコンパイラーはVC++6.0です。なぜ、ヘッダを変えただけでこのようなエラーが出たのでしょうか。漠然とした質問で答えようがないかもしれませんが、ご存知の方いらっしゃったら教えてください。お願いします。

  • c++での入出力がうまくいきません;

    初心者ですが独習c++でプログラミングについて勉強している者です。 なんとか環境設定もできたと思いきや、うまくコンパイルすることができなくて困っています。具体的には、 #include <iostream> using namespace std; int main() { int i, j; double d; i = 10; j = 20; d = 99.101; cout << "値を表示: "; cout << i << ' ' << j << ' ' << d; return 0; } という値を表示するプログラムではコンパイルもうまくいったのですが、次の #include <iostream> using namespace std; int main() { int i; cout << "値を入力: "; cout >> i; cout << "入力した値: " << i << "\n"; return 0; } という入力のプログラムをコンパイルしようとすると、コマンドプロンプトに演算子が使われたクラス ostream では int型の定義が存在しないとなりコンパイルエラーとなってしまいます。 理由が考えてもわからないので、質問してみました。 どのようにすれば、このエラーを解消できるのか知りたいので、どうかご意見をよろしくお願いします。

  • vectorを引数とする関数

    以下のようなプログラムにおいて、 #include <stdio.h> #include <cstdlib> #include <iostream> #include <vector> #include <fstream> #include <sstream> #include <map> using namespace std; double func(std::vector<double> *tmp2); int main(){ vector <double> tmp; tmp.resize(0); tmp.push_back(0.12458); tmp.push_back(-12.45); tmp.push_back(4.253); cout << func(&tmp) << endl; return 0; } double func(std::vector<double> *tmp2){ return tmp2[1]; } vector tmpをfuncに渡して、tmp[1]、すなわち、 -12.45が出力されるようにしたいと思います。 ですが、どうしてもコンパイルエラーが残ります。 どのようにすればよいでしょうか?

  • この文章正確ですか?

    #include <string> #include <iostream> using namespace std; int main(){ string s1; s1 = "こんにちわ"; count << s1 << endl; } これをコンパイルしようとしてもできません。 どこが間違っているのでしょうか?

専門家に質問してみよう