Version 2.14
いろんなライブラリ!
「前回は CWnd::MessageBox() とは別に MessageBox() って関数があるって
ことで終わりました」
『そーそー。メンバ関数と、普通の関数』
「その前に、プログラミングの世界について触れておきましょう」
『う、なんか堅そう』
「この Visual C++ で使うプログラミング言語は〈C++〉っていうもので
す」
『しーぷらぷら、ね』
「ぷらすぷらすって発音する人もいるけど、まあそれはともかくとして、
C++は関数の組み合わせでできてるって言いました」
『はい、いーましたー』
「ってことは、何をするにもまずは関数を呼ぶ、ってこと」
『そうよねー、文字を出すときには TRACE() 、ダイアログは MessageBox() 、
って感じだしねー』
「そういう、他から提供されている関数群を〈ライブラリ〉と呼びます」
『これもこの前したね』
「ということはつまり、ライブラリを知っていれば、たいがいのことはでき
る! ってことです」
『おお!』
「で、とりあえずこれだけは! っていうのが、次の3つのライブラリ」
・標準Cライブラリ(ランタイムライブラリ)
・Win32 SDK ( API )
・Microsoft Foundation Class ライブラリ(MFC)
『最後のしかしんない』
「うん、まだMFCしか使ってないから。全部必要なライブラリだし、もと
もとVCに付いてくるから使いやすいしね」
『でもこんなにいっぱい憶えらんないし、憶えなくていいんでしょ?』
「それはそうなんだけど、必要なときにちゃんと使えるように、だいたいど
んな関数があるのか、雰囲気は憶えてないとね」
『雰囲気ねー』
「で、その〈雰囲気〉をさっそく紹介しましょう」
『うん。まず標準Cライブラリって?』
「C++はCっていう言語を拡張したものなんだけど、標準Cライブラリは
そのCの時代のライブラリ」
『ってことは古いのってこと?』
「そういうこと。でも便利な関数が揃ってるんだよね。たとえば "3" って
文字列があったら、それを int 型の変数に入れるのってどうすればいいと
思う?」
『……こんな?』
void CCalcDlg::OnBEqual()
{
int iBox
= "3";
}
『あ、ビルドエラー』
「型を考えてみ。文字列ってなんていう型だっけ」
『えっと……そうそう、 LPCTSTR ってゆーわけわかんないの』
「そ。このわけわかんないのと int じゃ型が違うわけ」
『だからダメだったんだ』
「というわけで、標準Cライブラリから atoi() というものを使ってみま
しょう。まず、このファイルの頭で <stdlib.h> というヘッダーファイルを
インクルードします」
『このヘッダーファイルに、 atoi() っていうのの…… atoi() だ使え!
っていう宣言があるわけね』
「そのとおり!」
// CalcDlg.cpp : インプリメンテーション ファイル
//
#include <stdlib.h>
『あれ? なんでダブルクォーテーションじゃないの?』
「ライブラリのファイルみたいに、他のフォルダにまとめて置いてあるヘッ
ダーファイルを指定するときにはこの < と >で囲んで、同じプロジェクト
にあるファイルは " で囲む、ってことになってます」
『 <> はライブラリの印ってことね』
「で、こんな感じに使います」
void CCalcDlg::OnBEqual()
{
int iBox
= atoi( "3" );
TRACE( "%d\n", iBox );
}
『ビルドして実行、あ、ちゃんと iBox に3入ってる』
「こんなふうに atoi() を使うことで、文字列を整数に変えられます。こう
いう〈ツール〉っぽいのが揃ってるのが、標準Cライブラリ」
『確かにこれは便利ねー』
「次のライブラリは Win32 SDK。正式名称はそうなんだけど、 API て呼び
方の方がよく使われるかな」
『うぃんさんにーえすでぃーけー、に、えーぴーあい。意味は?』
「 Win32 は〈ウィンドウズの32ビット版〉って意味」
『え? フツー32ビットでしょ?』
「昔は16ビットとか8ビットとかそーゆーのがあったわけ」
『へー』
「SDK は Software Development Kit の略。つまり〈ソフトを作るための道
具〉ってことだね」
『API は?』
「Application Programming Interface の略。つまり〈アプリを作るための
インターフェイス〉ってこと」
『〈インターフェイス〉略してない〜』
「ぎく、まあパソコンに付いてるコネクタをインターフェイスっていうで
しょ、あんなふうに〈アプリが何かする時に継なぐコネクタ〉ってとこかな」
『SDK と API 、意味的に違うよね』
「たとえばUSBコネクタにマウスを継なげることを考えてみようか。パソ
コンは、マウスを使って操作できる〈道具〉だよね」
『そうなるね』
「このときUSBは、パソコンを操作するためのコネクタ、つまり〈インター
フェイス〉になるわけで」
『つまり、注目してるとこが違うってこと?』
「そういうこと。SDK は中身、API は入り口を見てるってことで、基本的に
は同じものってこと」
『ああ、同じものってことなんだ』
「最初に言ったやん……」
『で、この API ってライブラリ、なんに使うの?』
「よくぞ訊いてくれました!!」
『な、なに?』
「これこそが、ウィンドウズアプリケーションを作るためにもっとも必要な
ライブラリなのです!」
『もっとも必要?』
「そう。ウィンドウを作ったり、ダイアログ表示したり、その他もろもろは
全部この API に入ってるってわけ」
『もしかして、 ::MessageBox() も、その API の?』
「そういうこと。ちなみに :: は着けなくてもいいんだけどね」
『じゃあなんで着けてたの?』
「着けるとその関数が API って分かるから。メンバ関数じゃない、ただの
関数を呼び出すときには関数の前に :: を着けるといいから」
『え? なんでメンバ関数じゃないの?』
「API もC++より前の時代に作られたものだから。C言語にはクラスって
なかったんだよね」
『へー、プログラミングの歴史って結構古いのねー』
「そう。で、C++ができて、じゃあC++用にしよう、でも API を作り
替えると前のプログラムが使えなくなっちゃうよ、じゃあ API を呼び出す
クラスを集めたライブラリを作ろう、ってことでできたのが」
『MFC?』
「そういうこと。だから、 CWnd::MessageBox() っていう、API のと同名の
メンバ関数が存在して、その中で API を呼び出してるってわけ」
『なんかややこしいねー』
「簡単にまとめておこうか。標準Cライブラリはいろんなことをするための
ライブラリ。API はウィンドウを表示したりするためのライブラリ。MFC
は API を間接的に呼び出すライブラリ」
『ってことは、何をするにしてもライブラリってことねー』
「さらに、ライブラリにはもっといろんなのがあるから。CGを描くもの、
数学の計算をするもの、通信をするもの、もちろん僕や火美ちゃんがライブ
ラリを作ることもできるしね」
『そういうライブラリが集まって、必要なのを使っていって、なかったら自
分で作って、そうやってプログラムを作ってくんだ』
「だから、ライブラリをいかに使ってくかが大事。そうすればうんと楽がで
きるから」
『そりゃ、人の作ったもの使うんだから楽だろうけどさー、まだまだ先の話っ
て感じ』
「その、先の話」
『ん?』
「まず、バージョン2は今回で終わり」
『え!? 計算機作るって話は?』
「それはバージョン3で引き続き」
『じゃあ、なんで区切るの?』
「今回まではプロジェクト作って、簡単な計算して、if とかの使い方憶え
て、関数とライブラリについて勉強したでしょ」
『うん、したね』
「はっきし言って、ここまでできればあとは本とか見てけば結構いけると思
うよ」
『え、ホント?』
「ライブラリに入ってる関数の使い方、分かるでしょ?」
『うん、ヘッダーをインクルードするんだよね』
「それと、標準C++ライブラリや API の情報もMSDNに書いてあるか
ら」
『あれあんま役に立たないんだけど……』
「そういうときはインターネットで全文検索。goo や infoseek で使いたい
関数を検索すれば、実際に使ってるプログラム例が出てくるでしょ」
『そういうふうにも情報集めたりできるんだ』
「で、あとは〈どの関数を呼び出せばいいのか〉が分かればいいわけで、こ
れは調べるしかないけどね。でもこれで、たいがいのことができそうでしょ」
『心許なくはあるけど、頑張ればなんとかなりそうな気がする。けど、まだ
続けるんでしょ?』
「もちろん。バージョン3ではクラスの使い方とか、ダイアログの使い方と
か、フリーウェアの公開の仕方とか、そういうのを中心に解説します」
『そのあとは?』
「そうだねぇ……あ、金菜先輩」
「プログラミングの勉強は進んでる?」
『えっとねー、今日は API ってゆーの憶えたよ』
「……水希クン、君教えるの遅すぎ」
「そうかなぁ……そうそう、金菜先輩ってホームページで質問に答えるコー
ナー持ってますよね」
「〈金菜さんの憂鬱〉のこと? 今お休みしてるのよね……」
『人の質問に答えられるの? すごーい、よっぽど物知りなんだね』
「ううん、たいがい質問来てから調べるけど」
「よく間に合いますね」
「いい、プログラマーにとって一番必要なのは〈読解力〉よ」
『?』
「この世界にはいろんなライブラリがあるわけよね。その中に、質問の答が
入ってるってわけ。ライブラリを読み解く力があれば怖いものなしよね」
『でも、それってかなり大変じゃない?』
「読解力に必要なのは、アーキテクチャーと言語の知識」
「アーキテクチャーっていうのは〈構造〉って意味で、たとえば〈ウィンド
ウ表示のアーキテクチャー〉とかって使い方するかな」
『ってことは、ウィンドウを表示する中身ってこと?』
「中身とまではいかないんだけど、まあそういうこと。コンピューターや
OSの仕組みを知っていれば、〈ライブラリで何を実現するのか〉が分かる
でしょ。そうすれば〈実現するための書き方〉に注目すればいいわけ」
「たとえば ::MessageBox() の呼び出し方で、 CWnd::MessageBox() の呼び
出し方と火美ちゃんが書いたプログラムとでの違い、みたいな感じかな」
『お前が好きだ! と、うちおまえが好きやねん、の違いみたいな?』
「うーん、まあ、そうかも……」
「その違いを読み解くのに必要なのが、C++言語の知識」
『C++って、今日教わったのだよね』
「……水希クン、遅すぎ……」
「……」
「まあそういうことね。C++について知っていれば、ライブラリが何を言
いたいのか分かるようになるから」
『え? プログラムでも、意味とかそーゆーのあるの?』
「いいライブラリはしっかりと自己主張してくれるから、使いやすいのよ」
『へー、そういうものなんだー』
「アーキテクチャーの知識で何について言おうとしてるのか理解して、言語
の知識でどう表現しようとしているのか理解すれば、どんなライブラリでも
読み解けるってわけね。じゃ水希クン、しっかり教えてあげてね」
「あ、はい」
『……水希ちゃん?』
「あ、えっと、というわけで、バージョン4以降は、アーキテクチャーのこ
ととか教えていくことにします」
『なさけなー』
/*
Preview Next Story!
*/
『もう最初から半年くらい経ってるのねー』
「やっぱ遅いのかなぁ……」
『ダメ!』
「な、なに?」
『これ以上早かったら憶えきれないもん!』
「……なんだかなー」
『というわけで次回』
< Version 3.1 クラスってもの >
「につづく!!」
『でも普通の本と比べるとかなり遅いよね』
「確かに……」
『あ、その本で分かんないとこを補習してくのにいいかも』
「うーん……」