第1章 業界のスタンダード

 いよいよ始まります第4部。先ず第1章では標準ライブラリについてざっと話していこうと思います。みんなでこのライブラリを使い倒してしまいましょう!


 それでは、今回の要点です。


 では、いってみましょう。


 さて、皆さんはヘッダファイルを一切インクルードせずにプログラムを組んでみたことはありますか? もちろんヘッダファイルの中身を抜き出して書き込んでもダメです。

 え? それじゃぁ文字も表示できないじゃないかって? それは全くその通りで、C++で iostream.h などのヘッダファイル(の中身)なしにプログラムすることはほぼ不可能と言えます。コマンドラインと main の戻り値(第3部第41章参照)を駆使して何かの計算を行うとか、そうでなければせいぜい文法のチェック程度のことしかできません。

 このことから分かるように、C++自身の機能というのは

といった非常に単純な、最低限のものしかないのです。文字列を表示する機能も、ファイルを管理する機能も、全て関数やクラスという形で提供されているのです。

 こういった関数やクラスなどを集めたもののことをライブラリと呼びます。ライブラリは、既にライブラリの提供されているC++やアセンブリ言語などを使って作られています。

 つまり、C++はライブラリがなければ、入力も出力も出来ない全く役立たずな言語になってしまうわけです。逆に言うと、C++が役立たずではないのもこのライブラリがあるおかげなのです。


 さて、ライブラリのおかげでC++がパワーアップするのは構わないのですが、肝腎のライブラリがコンパイラによって異なっていると厄介です。例えば、あるコンパイラでは文字の出力は cout << で行い、別のコンパイラでは console_out という名前になっていて、さらに別のコンパイラではもっと別の機構を使っているという具合です。どうでもいいような機能であればまだしも、基本的な機能でそうなっているとすれば、別のコンパイラでも動くようにするのが非常に面倒になってしまうということは想像がつくと思います。

 そういうわけで、C/C++にはどのコンパイラでも備えていることが推奨されている関数やクラスというものがいくつも規格で定められています。それらを集めたライブラリのことを標準ライブラリと総称します。これには cout や sprintf といった基本的な機能が一通り備えられています。標準ライブラリ内の関数やクラスのみを使ったプログラムは、この規格に沿っているコンパイラであればどれでもコンパイルでき、正常に動作するというわけです(そう理想通りいかないこともありますが...)。

 そして、もちろんヘッダファイルだけでは関数は使えませんので、何らかのリンクも行われます。標準ライブラリであれば多くは自動的にリンクされると思いますが、使用頻度の低いものは指定しないといけない場合もあります。

 と、ややこしいことをいろいろ話してきましたが、ここで重要なことは標準ライブラリというのが用意されているということだけです。今まで使ってきた cout や sprintf などは大抵標準ライブラリ内のオブジェクトや関数で、第4部ではそういったライブラリについての話をしていこうというわけなのです。


 しかし、規格は時代と共に変わっていき、古い規格のものとの互換性は保ってはいるものの、推奨される標準ライブラリというのが若干変わってきています。今までずっと使ってきていた stdio.h や iostream.h といったヘッダファイルはこの古い規格のもので、現在では cstdioiostream といったヘッダファイルが推奨されています(2001年7月1日現在)。

 ではなぜこの新しいヘッダファイルを使って話してこなかったかというと、この中にある関数やクラスなどは std という名前空間(第2部第50章参照)に属しているからです。名前空間については後の方で話すつもりだったので、新しいヘッダファイルは必然的に使えなかったのです。また、名前空間のサポートされていないような古いコンパイラでも動くようにしたかったということもありました。

 しかし、第4部ではこの新しいヘッダファイルをどんどん使っていきます。というわけで、早速 Hello プログラムでも作ってみましょう。

プログラム
// Std1.cpp
#include <iostream>  // .h はつけません!

// using しなければ、std::cout や
// std::endl のように使うことになります
using namespace std;

int main()
{
    cout << "おっす!" << endl;
    return 0;
}
実行結果
おっす!

 先ず、iostream というヘッダファイルをインクルードします。これは iostream.h を新しい規格に基づいて書き換えたものです。基本的な動作は以前と全く変わりませんが、cout や endl などは std という名前空間に属しています。つまり、このままであれば cout は std::cout と、endl は std::endl と使うことになるわけです。こんな感じですね。

std::cout << "おっす!" << std::endl;

 しかし、この1文だけならともかく、沢山になると std:: をつけるのが面倒になるので using してしまいましょう。using namespace <名前空間名>; と書くとその名前空間名を省略できるようになるのでしたね。

using namespace std;

 これで std:: が省略できるようになったので、あとは今まで通りプログラムを書いていけばいいだけです。

cout << "おっす!" << endl;

 つまり、新しいファイルをインクルードしても、using namespace std; を書いておけば古いコードはそのまま使えてしまうというわけです。


 では最後に、標準ライブラリ用のヘッダファイル、標準ヘッダファイルについてザッと話しましょう。

 標準ヘッダファイルは大きく次の3つに分けることができます。

  1. sprintf などのようなC言語でも使えるものを std 名前空間内に入れたもの
  2. cout のような古いC++でも使えるものを新しい規格に基づいて書き換えたもの
  3. 新しい規格のもとで追加されたもの

 1.のヘッダファイルには cstdio, cstdlib, cstring, ctime などがあります。この名前は古い名前の上に c をつけて .h を取り除いた形になっています。

 2.のヘッダファイルには iostream などがあります。この名前は基本的には古い名前の .h を取り除いた形になっています。

 しかし、中には例外もあります。例えば、VC++の古いヘッダファイルの拡張子を除いた名前は8文字以下にされているので(MS−DOS用に書かれたソースとの互換性のためでしょう)、strstream という長い名前のクラスの定義の入ったヘッダファイルの名前は strstrea.h のように m だけ切れてしまっています。新しい規格ではもう気にしなくなったらしく、これは strstream のように m もちゃんと付いた形になります。stdexcept.h → exception というのもあります。

 3.のヘッダファイルには algorithm, functional, vector, string などがあります。主にはテンプレートから構成されていて、それらはSTL(Standard Template Library : 標準テンプレートライブラリ)と呼ばれています。第4部でメインに話すのはこのSTLについてです。

 このように、現在の規格の標準ヘッダファイルには .h はつけられていません。あとはC言語用のヘッダファイルには c を先頭に付けるということさえ忘れなければいいわけですね。


 では、今回の要点です。


 歴史の話をしたところで新しくC++を知る人にとってはあまり意味がないと思うかもしれませんが、古い環境が未だに残っているようなところでプログラムする機会もまだあるかもしれないので、ちょっと心の片隅にでも止めておくといいかもしれませんね。


第2部第50章 名前空間 | 第2章 アル・コワリズミ

Last update was done on 2001.7.1

この講座の著作権はロベールが保有しています