#pragma twice

KAB-studio > プログラミング > #pragma twice > 322 Version 15.22 「プロジェクトの設定」コンパイル編(2)

#pragma twice 322 Version 15.22 「プロジェクトの設定」コンパイル編(2)

前のページへ 表紙・目次へ 次のページへ

 Version 15.22
プロジェクトの設定コンパイル編(2)

ごめんなさい
何いきなり!?
前回、【プリプロセッサの定義】では【#define AAA 0】のような数値や
文字列の定義には使えない、と説明しました
……できるの?
できました。たとえば【AAA=100】とすると、【#define AAA 100】と同じ
意味になります
おお
複雑なマクロとかは無理だけど、整数リテラルや文字列リテラルの代わり
として定義することはできます。指摘してくださった方、ありがとうござい
ます
ありがとねー!! ってゆーかダメじゃん!
ごめんなさい
はいはい。で、今回は?
今回は、前回の続き【プロジェクトの設定】ダイアログについて説明しま

前回は【C/C++】の【オプション】までね。まだ半分終わってないのが怖
いね……
前回は下の【プロジェクト オプション】の説明もしたからね。ではさっ
そくいきます
はーい
【コード生成】ページは、プログラムをコンパイルして
オブジェクトファイルにする時に、どういう形式にするかの説明。最初の
【プロセッサ】は、 CPU の設定
 CPU って、 Intel とか AMD とかの?
ううん、それはそうなんだけど、そういう違いじゃなくて、バージョン
の違い。【80386】ってあるでしょ、これなんかはかなり古い CPU 
へー、聞いたことない
デフォルトの【ブレンド】は特に指定しない場合。普通はこれでいいか
な。次の【使用するランタイム ライブラリ】は、ランタイムライブラリの
種類の指定
ランタイムライブラリにいろんな種類があるの?
〈ランタイムライブラリ〉そのものはひとつだけど、ビルドしたあとの、 
DLL がいくつもバージョンがあるんです

・シングルスレッド
・マルチスレッド
・マルチスレッド(DLL)
・シングルスレッド(デバッグ)
・マルチスレッド(デバッグ)
・マルチスレッド(DLL、デバッグ)

マルチスレッドは Version 14.01 ( No.268 ) のだよね
そう、あのマルチスレッド。実は、ランタイムライブラリは
グローバル変数を使っている箇所が多いんです
んー、それってマルチスレッドだと問題ある?
あるでしょ、同期取らなきゃ
あ! そっか、いろんなとこからアクセスされるから、同期取らないと変
になっちゃう!
マルチスレッド版はその処理がされてるってこと。その分ちょっと遅いけ
ど、それでもマルチスレッド版だけ使えばいいかな
デバッグはそのままデバッグ版ね
ランタイムはソースコードがあるから、ステップインでランタイムの中ま
で追っていけるんです。だからデバッグ時にはデバッグ版がいいかな
あとは DLL かそうじゃないか、ね
〈そうじゃない場合〉はスタティックリンクライブラリになります。これ
は、基本的には以下のどちらかにすればいいかな

・マルチスレッド(DLL)
・マルチスレッド(DLL、デバッグ)

ただ、【一般】-【Microsoft Foundation Class】で【MFC のスタティック 
ライブラリを使用】を選んだ場合には、ランタイムを DLL にすると
ランタイムの方の DLL は配布しなきゃいけないから、そういう時は

・マルチスレッド

がいいかな
配布する DLL ってなんて名前?
 MVSCRT40.dll 。だから、実際に配布するなら MFC42.dll とこれ、ペア
で配布する必要があります
これもたいがいのに入ってる?
うん、今のほとんどの Windows には入ってるだろうから気にしなくてい
いと思うよ。次の【呼び出し規約】は
はい! これは知ってます! 普通の関数は __cdecl で、
コールバック関数は __stdcall なんだよね
 Version 8.01 ( No.143 ) とかで説明したね。基本的に、 Exe の中で呼
び出す関数は __cdecl 、 DLL とかから呼び出される関数は __stdcall を
付けます
ここで __cdecl を設定しているから、デフォルトは __cdecl なんだね
そういうこと。で、外から呼び出す関数は、 __stdcall を付ければいい
わけ。実際には、 WINAPI がそうだからこれを付ければいいかな。最後の
【構造体メンバのアライメント】は、 Version 12.11 ( No.234 ) で説明し
た、パディングとアライメントの話
あ、そういえばこの時にもこの設定って教えてもらったね
ここで問題になるのは、構造体をそのままファイルに保存するような場合
かな。そういう場合、プログラムをバーションアップさせる時とかに、誤っ
てこの設定を変えちゃったりすると
前のファイルが読み込めなくなる!
っていうことが起きちゃうんです。だから特に必要じゃなければ、
デフォルトの【8】のまま固定がいいかな
そんなことでバグ出すの嫌だもんね……
次のページ、【ファイル リスティング】は、プログラムについての
別ファイルを出力するための設定
別ファイル?
最初の【ブラウザ情報を生成する】については、あとで【ブラウザ情報】
タブの解説をする時に説明します
あ、それってこの前も言ってたね
前回、 Version 15.21 ( No.321 ) のだね。ちなみにこれとその設定は
全く同じもの。だからどっちかをオンにすると
もうひとつもオンになる!
両方とも共通のオプションを使ってるからね。下にある
【リスティング ファイル タイプ】は、【リスティングファイル】ってい
う、関数についての本当に細かい情報が書かれたファイルを出力するため
のもの。たとえば【ソースコードを含む】にして、その下の
【リスティング ファイル名】を /Debug のままにすると、
/Debug/Main.asm っていうファイルが出力されます。たとえば、この中の
WinMain()の箇所を抜き出すと……

PUBLIC  _WinMain@16
;   COMDAT _WinMain@16
_TEXT   SEGMENT
_WinMain@16 PROC NEAR                   ; COMDAT

うわ、目眩がしそう……
これは、プログラムをコンパイルした後の【アセンブラ】っていう言語で
書かれたもの。でもこれはかなり上級者向けだから、とりあえず必要ないか

うん、これは難しそう……
次は【プリコンパイル済みヘッダー】。これは結構重要です
え、そうなの?
これまで出てこなかったけど、はまるとコンパイルが通らなくなるから
う、それは怖い……
えっと、今まで BuildTest で説明してきたけど、ここだけは MFC の
プロジェクトがいいので Version 11.01 ( No.201 ) の時に作った
StringTest プロジェクトみたいに、 MFC ベースのプロジェクトを開いて
ください
ほい、開いて、この設定も開いてと……あ、設定が違う
まずはその辺と、ファイルの意味から説明しようか。【プリコンパイル
済みヘッダーファイル】というのは、拡張子が .pch のファイルのことで

あ”!! そのファイル、いっつもすんごくでっかいファイル!!
そう、 5MByte くらいのサイズになる大きなファイルです。これは
【プリコンパイル】、つまりコンパイルの前段階の処理をしてある
ヘッダーファイルを集めたものです
ヘッダーファイルの集まり?
 Win32API や MFC には、膨大なヘッダーファイルが存在します
うんあるね
コンパイル時にはこれらのファイルを読み込むわけですが、その際、毎回
#define マクロとかの処理をしていたら大変です
だから、先に全部しておいちゃおう、ってこと?
そういうこと! そういう処理を先にしてあるファイルがこの .pch 
ファイルです。コンパイル時にこのファイルを使用することで、コンパイル
の時間が早くなります
へー
一番上の【使用しない】だと、この処理をしないので毎回のコンパイルが
時間掛かります
さっきの BuildTest は、2番目の【自動的に使用】だったね
この【自動的に使用】はうまくいかない場合が多いので、実際には下の
ふたつを使い分けます

・プリコンパイル済みヘッダー ファイル(pch)の作成
・プリコンパイル済みヘッダー ファイル(pch)を使用

使い分ける? 状況に応じて、ってこと?
ううん、ソースファイルに応じて。左のツリーの中の、【Source Files】
の中を開いて、それぞれの .cpp ファイルを見てみて
……あ! StdAfx.cpp だけ【作成】で、それ以外は【使用】だ!

・プリコンパイル済みヘッダー ファイル(pch)の作成
 →StdAfx.cpp
・プリコンパイル済みヘッダー ファイル(pch)を使用
 →StringTest.cpp
  StringTestDlg.cpp

ここで、その StdAfx.cpp を見てみて
 StdAfx.h をインクルードしてるだけだね
その StdAfx.h は?
いろんなヘッダーファイルをインクルードしてる……!
そう、 StdAfx.h は、プロジェクト全体で使うヘッダーファイルを
インクルードするためのファイルです
そういえば StringTest.cpp や StringTestDlg.cpp もインクルードして
るんだよね
この StdAfx.h では、プロジェクト内のヘッダーファイルはインクルード
せず、外部、主に Win32API と MFC のヘッダーファイルをインクルードし
ます。これらのファイルは滅多に変更されないから
プリコンパイル済みヘッダーファイルのにするのにもってこい
ってこと。というかそういうファイルを集めている、ってことかな。そこ
で、 StdAfx.cpp は【作成】し、これを他の cpp ファイルから【使用】す
るわけです
なるほど!
これまで StdAfx.cpp や StdAfx.h の意味が分からなかったかもしれなけ
ど、このプリコンパイル済みヘッダーファイルを作るためのもの、ってこと
なんです
そのための?
そう、そのためのファイル。こうして、滅多に変更されない
ヘッダーファイルを StdAfx.h でインクルードして、プリコンパイル済み
ヘッダーファイルにすることで、コンパイルの時間を短縮するわけです
なるほどね……あ、だから、この中で自分のプロジェクトの
ヘッダーファイルをインクルードしちゃだめなんだ
滅多に修正されないならいいんだけど、そういうことは少ないし、関係が
複雑になるからやめた方がいいかな
だね
ま、 MFC のプロジェクトの場合、初期設定をそのまま使えば問題ないだ
ろうけどね。今回の知識が必要になるとしたら、 BuildTest みたいに、 
MFC じゃないプロジェクトを作って、 StdAfx.h 代わりのファイルを使うよ
うな時かな
デフォルトが【自動】だったもんね
この知識があれば、自分でちゃんと設定できるから。そういうのをしてみ
て理解する、っていうのもいいかも

/*
    Preview Next Story!
*/
というわけでまだ続きます
長すぎ!
これでも結構省略してはいるんだけどね
次は残りのC/C++のね

な、なに?
というわけで次回
< Version 15.23 プロジェクトの設定コンパイル編(3) >
につづく!
逆に分量少ないかも
……バランス取るの下手……
 
del.icio.us 登録する
Yahoo!ブックマーク 詳細を表示 users
livedoorクリップ 詳細を表示 livedoorクリップ ブックマーク数
はてなブックマーク 詳細を表示 はてなブックマーク ブックマーク数
RSSに登録
del.icio.us 登録する
Yahoo!ブックマーク 詳細を表示 users
livedoorクリップ 詳細を表示 livedoorクリップ ブックマーク数
はてなブックマーク 詳細を表示 はてなブックマーク ブックマーク数
 
このページは、Visual C++ 6.0を用いた C++ 言語プログラミングの解説を行う#pragma twiceの一コンテンツです。
詳しい説明は#pragma twiceのトップページをご覧ください。