Version 3.24
デバッグビルドとリリースビルド
「というわけで、〈計算機アプリケーション〉は完成ってことにします」
『……なんだかなー』
「でもね、こういうプログラムって手を加えていくとキリがないし、手を加
えすぎてもね」
『シンプルイズベスト! どの辺がいちばんいいか、とかも考えるの大事だ
よね』
「そうそう」
『ってことはこれくらいシンプルな計算機が実はウケたり?』
「それはない。さて、おさらいも兼ねて、これまで手を加えてきたところを
見ていきましょう。まず、 Calc.cpp に GetTheApp() って関数を作りまし
た」
『 theApp そのものを返す関数だよね』
「次に CCalcApp::InitInstance() 。これもかなりお世話になったね」
『なったねーここは』
CCalcDlg dlg;
m_pMainWnd = &dlg;
// のあとに追加しました。
CString cCompanyStr;
cCompanyStr.LoadString( IDS_REG_COMPANY );
SetRegistryKey( cCompanyStr );
『そういえばこれだけなんだね、ほとんど CCalcDlg に移しちゃったから』
「プログラムはできる限り小さい方がいいからね。あ、あとこのあとに」
int nResponse = dlg.DoModal();
if (nResponse == IDOK)
{
}
else if (nResponse == IDCANCEL)
{
}
『これは最初からあるのそのままだね』
「でも【OK】ボタンを押したとき、とかは CCalcDlg に移したから」
『あ、いらないんだ、この if とか』
「だから」
dlg.DoModal();
『うわー、かなり小さくなっちゃったね』
「プログラムの〈なんで〉を知っていれば、最初からあるものを削ることも
できるってことだね」
『削る?』
「そ。ブラッシュアップって言うんだけど、無駄なプログラムが少なければ、
ビルドしたあとの実行ファイルが小さくなるし、少し速くなるから」
『ぜい肉みたいなもんね』
「でも増やすのは楽だけど減らすのは結構大変。そのために」
『おやつ抜き』
「じゃなくてー、プログラムのちゃんとした知識が必要ってこと。それにお
やつはあった方がやせられるって説もあるよ」
『なんでそんなこと知っとんねん……』
「さて CalcDlg.cpp 」
『こっちにほとんどのプログラムがあるんだよね』
「そういう風にしたからね。まずは CCalcDlg::OnInitDialog() 」
『えーっと、前々回の時は、書き加えた部分全体を載せてなかったから、今
回載せます』
// SetIcon(m_hIcon, FALSE); // 小さいアイコンを設定
SetIcon( AfxGetApp()->LoadIcon( IDI_DLGICON ), FALSE);
// TODO: 特別な初期化を行う時はこの場所に追加してください。
CString cDialogStr;
cDialogStr.LoadString( IDS_REG_DIALOG );
CString cAnsStr;
cAnsStr.LoadString( IDS_REG_ANS );
m_iAns = GetTheApp().GetProfileInt( cDialogStr, cAnsStr, 0 );
UpdateData( FALSE );
『あれ、アイコンのって』
「大きいアイコンと小さいアイコンの話の時のだね。 Ver 3.6 ( No.031 )
を参照してください」
『そうそう、小さいアイコンは別にしとくんだよね』
「ちなみにここにある AfxGetApp()-> と、この前作った GetTheApp().は同
じだったりします」
『どゆこと?』
「つまり」
SetIcon( GetTheApp().LoadIcon( IDI_DLGICON ), FALSE);
「ってできるってこと」
『はて、分かるような分からないような……』
「ホントは、わざわざ GetTheApp() を作る必要はなかったってことだね。
元々 AfxGetApp() っていうのが MFC に用意されてるから」
『ってことは無駄なことさせられたってことぉ?』
「でもさ、 -> 演算子って」
『知らん』
「でも . は」
『知ってる。 dlg.Modal() みたいに、メンバ関数やメンバ変数使う時の』
「だからわざわざ作ったってことね」
『でも -> と . の違いって?』
「それはもちょっと先でね。あと、CCalcDlg::OnInitDialog() の最初の所
で CDialog::OnInitDialog() が呼ばれてるのも確認しといて」
『あ、ホントだ。これってこの前の、オーバーライドとかのと同じ?』
「そゆこと。あと、【=】ボタンを押したときと、【OK】ボタンを押したと
きのイベントハンドラ。これはまとめて」
void CCalcDlg::OnBEqual()
{
UpdateData( TRUE );
m_iAns = m_iLh + m_iRh;
UpdateData( FALSE );
}
void CCalcDlg::OnOK()
{
CDialog::OnOK();
CString cDialogStr;
cDialogStr.LoadString( IDS_REG_DIALOG );
CString cAnsStr;
cAnsStr.LoadString( IDS_REG_ANS );
GetTheApp().WriteProfileInt( cDialogStr, cAnsStr, m_iAns );
}
『これは完璧?』
「完璧ってことは……」
『えーそーなの?』
「例えば、 cDialogStr 作ったりするのって CCalcDlg::OnInitDialog() で
もしてるでしょ」
『あ、そういえば』
「こういうふうに、同じのをいろんなとこに書くとミスが出やすいから、本
当は CCalcDlg のメンバ変数とかにして使い回す方がいいかな」
『なるほど』
「で、プログラム関係はこれくらい」
『ホント、基本的にシンプルだよね』
「ただ、量的にはそれなりにあるよ。イベントハンドラごとに分かれてるか
ら、少なく感じるだけで」
『全部まとめたら大きいってことなんだ。でも〈小さいプログラムの組み合
わせ〉が大事なんでしょ?』
「そういうこと。こんなふうにイベントハンドラ関数ごとにプログラムを分
ければ分かりやすいってことだね」
『はーい』
「あとはリソース」
『アイコンとかバージョン情報とか、バージョン情報ダイアログとかだね。
うん、これはちゃんとしたよ』
「フリーウェアとして公開するんならこういうのもちゃんとしなきゃね。
で、今回最後は」
『デバッグビルドとリリースビルド! ってなに?』
「んーとまず、プログラムの間違いを〈バグ〉って言います」
『あ、ゲームとかでよく言うよねそれ。画面ぐちゃぐちゃになって〈あ、バ
グった!〉とか』
「そのバグを取り除くことを〈デバッグ〉っていいます」
『で、デバッグビルド?』
「そう。実は、今までしてきたビルドはこの〈デバッグビルド〉。デバッグ
ビルドはデバッグ用のいろんな機能がついてます」
『いろんな機能って?』
「例えばブレークポイントとか」
『え、あれってどんなアプリでもできるんじゃないの?』
「デバッグビルドしなきゃ、ブレークポイントは使えないの。あと TRACE()
も実はデバッグビルド専用」
『えっ、てことはフツーのアプリはアウトプットウィンドウに文字表示した
りできないの?』
「一応ね。で、こういったことができないようなビルドを〈リリースビルド〉
っていいます」
『えー、なんかそれって不安』
「でもデバッグビルドだと余分なものがいっぱい憑いてるから、実行ファイ
ルが大きくなるし、少し遅くなるし」
『つまりブラッシュアップってこと?』
「手軽なブラッシュアップ、かもね。だから、デバッグビルドで作ったプロ
グラムで入念にテストしたあと、リリースビルドでアプリを作って、公開」
『それがパターンってことなんだ』
「そういうこと。じゃ、さっそくしてみましょう。メニューの【ビルド】
−【アクティブな構成の設定】を選んで」
『はーい』
【プロジェクトの標準構成】というダイアログが表示される。中に
Calc - Win32 Release と Calc - Win32 Debug があり、後者が選択され
ている。
『 Debug がデバッグ、 Release がリリースだよね。じゃ、 Release の方
を選んで OK っと』
「そしたらビルド」
『ビルド。あ、時間かかってる』
「全部別のファイルとして新しく作り直すからね」
『あ、終わった』
「そしたら、できた Calc.exe を見比べてみようか。 Calc.cpp とかがある
フォルダを開いて」
『メニューの【ファイルを開く】っと。あ、 Debug と Release のフォルダ
がある!』
「デバッグビルドしたのとリリースビルドしたのが別々に置いてあるってこ
と。両方とも開いて、 Calc.exe のサイズを比べてみて」
『えっとねー、 Debug が 108KB 、 Release が…… 24KB って4分の1以
下!?』
「こんだけ違うわけ。リリースビルドした方がいいってことが分かったで
しょ」
『ホントねー、これだけ違うとねー』
「当たり前だけど、もちろん普通のアプリとして機能するから」
『あ、そっか。ダブルクリック……ちゃんと計算機してる!』
「足し算だけだけどね」
『うっさいなー』
「じゃ、最後にちょっと難しい話」
『えー?』
「ま、軽く聞き流すくらいでいいから。メニューの【プロジェクト】−【設
定】を選んで」
『はーい』
【プロジェクトの設定】ダイアログが表示される。
『あ、上の【設定の対象】が Win32 Release ってのになってるけど、もし
かして?』
「その通り。えっと右側の【C++】ページの、カテゴリ【一般】に【デバッ
グ情報】ってあるでしょ」
『うん、【しない】になってる』
「ここで【設定の対象】を Win32 Debug にすると……」
『あ、【エディットコンティニュー用のプログラムデータベース】とかゆー
のになった!』
「つまり、リリースだとデバッグ情報を作らなくて、デバッグだとなんか作
ってくれるってこと」
『ほー』
「今は簡単にデバッグとビルドって言ってるけど、ホントはこういう細かい
設定の話なんだってこと、ちょっとだけ憶えといて」
『ってことは、いつかこれもわかんなくちゃいけないってことなのね……』
/*
Preview Next Story!
*/
『来週で最終回!』
「最終回じゃありません、まだまだ続きます」
『まだまだ先は長いのね』
「というわけで次回」
< Version 3.25 フリーウェア、公開! >
『につづく!!』
「ま、今の予定じゃ全150回、3年ってとこだね」
『ってことはきっと50年は掛かるのね!!』
「おい」