Version 15.21
「プロジェクトの設定」コンパイル編(1)
「今回は前回の続き、【プロジェクトの設定】ダイアログについて説明しま
す」
『なんか重要なとこに全然入れなかったから、今回の方が重要ね』
「うん、今回はコンパイルの設定を説明するから。分量あるからさっそくい
くよ!」
『はい!』
「【C/C++】タブは、コンパイルの設定をするものです」
『コンパイルって書いてなくてもコンパイルなのね』
「そうです。まず【一般】ページから。【警告レベル】は、プログラムが正
しくない時に出力される警告の、どのくらい重い警告なら出力するかを指定
するもの」
『?』
「警告っていうのは、コンパイルする時に出てくるもので、コンパイルエラー
ほどの重要な問題じゃないけど、プログラムのミスじゃないか、っていうも
の。たとえばこれ」
// Main.cpp
#include <Windows.h>
int WINAPI WinMain
( HINSTANCE p_hInstance
, HINSTANCE p_hPrevInstance
, LPSTR p_pchCmdLine
, int p_iCmdShow
)
{
i2 = 100; // コンパイルエラー。
// return 0; // ワーニング
}
「これをビルドすると、次のように出力されます」
error C2065: 'i2' : 定義されていない識別子です。
warning C4508: 'WinMain' : 関数に戻り値の型が指定されていません。
戻り値を void 型と見なします。
「上の【error C2065】が、コンパイルエラー」
『存在しない変数使ってるんだから当然よね』
「下の【warning C4508】が警告」
『あ、 return がないから?』
「そう。関数って、 return がないと、 return 0 してるものと見なすんだ
けど、普通は return ってあるはずだから」
『ないから警告を出して教えてくれてる、ってわけね』
「そういうこと。警告は、コンパイルそのものは通るから放っておいてもい
いんだけど、ほとんどはプログラムミスだから」
『教えてもらった方がいいわけね』
「でも、無視していい警告っていうのもあるんです。【警告レベル】を
【レベル 4】にしてビルドすると、次のような警告が出てきます」
warning C4100: 'p_iCmdShow' :
引数は関数の本体部で 1 度も参照されません。
『……引数の p_iCmdShow を使ってないから警告が出てる……』
「ってこと。でもこんなの無視していいから」
『うん、全部使う必要なんてないし。あ、これを表示させないようにするの
がこの設定?』
「そういうこと。レベルを上げれば、重要度の低い警告が表示されなくなり
ます。でもデフォルトの3くらいがいいかな」
『この、警告のレベルってどうやったらわかるの?』
「 MSDN に書いてあるよ。試しに C4100 とか見てみて」
『あ、レベル4 って書いてある』
「出力されるのは【警告レベル】で設定したレベル以上……以上っていうの
は変か」
『【レベル 3】で設定していたら、【レベル 4】は出力されない、だよね』
「そういうこと。この設定の下の【警告をエラーとして扱う】は、警告を
コンパイルエラーと同じ扱いにするってこと」
『ってことは無視できないんだ』
「そういうこと。レベル 3以上の警告は普通発生しないから、これはオンで
もいいかな。次の【最適化】は、コンパイル時のプログラムを切りつめて、
速くしたりファイルサイズを小さくしたりすること」
『おおっ、かっこいい!!』
「でも、これをするとうまくいかなくなることが多いから【デフォルト】が
いいかも」
『えー?』
「あとデバッグ時には【無効(デバッグ時)】で。次の【ブラウザ情報を生成
する】は、専用の【ブラウザ】タブがあるのでそちらで説明します」
『ホントだ、右の方にある』
「【デバッグ情報】は、.pdbファイルの内容や、そのファイルを作るかどう
かの設定。【エディット・コンティニュー用のプログラム データベース】
を選ばないと普通のデバッグができないからこれにして」
『はーい』
『最後は【プリプロセッサの定義】。これは #define の代わりね』
「ここに【AAA】って追加するってことは」
#define AAA
「と同じってこと。ただ」
#define AAA 0
「みたいに、マクロとしての使い方はできないから」
『置き換えには使えないってことね』
「だから #ifdef 用ってこと。あと、この設定の中にある【_DEBUG】は、
デバッグ関係の機能をオンにするためのもの」
『 Version 6.18 ( No.118 ) のね』
「こういうところに設定が隠れているから注意して」
『どゆこと?』
「デバッグ機能をオン・オフする設定があるわけじゃない、ってこと」
『あー』
「こういうのは仕組みもわかってないと難しいかもね。では次のページ」
『え? 一番下は?』
「一番下は、設定欄じゃないんです。これは最後にまとめて説明します」
『う、なんか重要そう……』
「次は【C++ 言語】のページ、なんだけどパスします」
『ええっ!?』
「 C++言語の特別な機能の設定だけど、今の段階だと関係するものがないか
ら」
『うーん……』
「次の【カスタマイズ】はこまごまとした設定。まず【Microsoft 言語拡張
機能を無効にする】は、オンにすると厳密な C言語のルールに沿った
プログラムしか作れなくなります」
『その方がいいんじゃない?』
「でもこれまで作ってきたプログラムが使えなくなるかも」
『それは困る』
「だからとりあえずこれはオフでいいかな。次のふたつ【関数レベルの
リンクを有効にする】と【同一文字列を削除する】は、特定の場合以外は
グレーになっています」
『特定の場合?』
「具体的に言うと、【一般】ページの【最適化】が【無効(デバッグ時)】か
【デフォルト】で、かつ【デバッグ情報】が【しない】の場合」
『それってどういう状況?』
「リリースビルドで、かつ最適化しない場合」
『余分なことしてない場合、ってこと?』
「そういうこと。【関数レベルのリンクを有効にする】は関数の呼び方の設
定。これはオンでもオフでも変わらないかな。【同一文字列を削除する】は
文字列リテラルの最適化の話」
『文字列リテラルって"あいう"とかのことだよね』
「 Version 5.06 ( No.071 ) でやったね。こういった文字列リテラルは、
実行時にメモリ上のどこかに置かれます」
『配列みたいに?』
「そう。その時、同じ文字列リテラルがあったら、その重複している分を削
除するのが、この設定」
『あー、なんだか最適化みたい』
「そうだね、こういうふうに分散してるのはちょっとね。これをオンにする
と少しはメモリが節約できるだろうけど、大きくは変わらないからどっちで
もいいと思うよ」
『オンでもオフでもいい、と』
「次の【簡易リビルドを行う】と【インクリメンタルコンパイルを行う】は
コンパイルが速くなる設定。マシンパワーがあまりない場合には、両方とも
オンにするとコンパイルが速くなるかな」
『ほほう』
「最後の【開始メッセージを表示しない】は、これをオフにすると、
コンパイル時に次のメッセージが出力されるようになります」
Microsoft (R) 32-bit C/C++ Optimizing Compiler
Version 12.00.8804 for 80x86
Copyright (C) Microsoft Corp 1984-1998. All rights reserved.
cl /MDd /W3 /Gm /Gi- /GX /ZI /Od /D "WIN32" /D "_DEBUG"
/D "_WINDOWS" /D "_AFXDLL" /D "_MBCS" /Fp"Debug/SDITest01.pch"
/Yu"stdafx.h" /Fo"Debug/" /Fd"Debug/" /FD /GZ /c
『長!!』
「これは、コンパイラの種類とバージョン、コピーライト、そして
コンパイル実行時のオプションの設定」
『バージョンとかコピーライトは分かるけど、設定って……』
「じゃあこれと、一番下にある【プロジェクト オプション】の中身を比較
してみようか」
/MDd /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS"
/D "_AFXDLL" /D "_MBCS" /Fp"Debug/SDITest01.pch" /Yu"stdafx.h"
/Fo"Debug/" /Fd"Debug/" /FD /GZ /c
『あ、ほとんど同じだ!!』
「まず、 Version 15.01 ( No.301 )を思い出して。コンパイルって、
ソースファイル単位でしてたよね」
『うん、してた』
「そのコンパイルをするのが、【コンパイラ】というものです」
『コンパイラがコンパイルをする、ね』
「そのコンパイラの正体は、 cl.exe という実行ファイルです」
『え? VCがするんじゃないの?』
「 Visual C++ は【開発環境】。エディタを使ってソースファイルとかの修
正をしたり、デバッグをするためのものです。コンパイルやリンクは、専用
の実行ファイルが行うんです」
『知らなかった……』
「ま、そういう実行ファイルも VC 付属のものだから、一部って事なんだけ
どね。話を戻すと、コンパイルは、 cl.exe を実行して、その時に
ソースファイルと、〈どうコンパイルするか〉を指定する設定を渡す必要
があります」
『設定……あ!』
「そう、それが、さっきの」
cl /MDd /W3 /Gm /Gi- /GX /ZI /Od /D "WIN32" /D "_DEBUG" (以下略)
「です」
『最初の cl って、 cl.exe のことなんだ』
「そういうこと。そして……もう一度【プロジェクトの設定】ダイアログを
開いて、たとえば【C/C++】-【カスタマイズ】の【開始メッセージを表示し
ない】をオン・オフすると」
『あ! オンにすると /nologo っていうのが出て、オフにすると消える!』
「まとめると、以下のようになります」
【プロジェクトの設定】ダイアログの【C/C++】の設定を変える
↓
下の【プロジェクトのオプション】の設定が変わる
↓
コンパイル時のオプションが変わる
↓
コンパイル結果が変わる
「ここの設定は、このコンパイルの設定を変えるためのものってこと」
『結構マニュアル気味なんだ』
「オプションの中には、なぜか上の設定にないものもあるから、そういう場
合には下の【プロジェクト オプション】を直接変えるっていうこともでき
るから」
/*
Preview Next Story!
*/
『……なんだか、これだけでひとつの章にした方がいいんじゃない?』
「そんなに分量は無いはずだけど……」
『本当? 本当に??』
「……まぁもう後には引けないし」
『うわ開き直りやがったコイツ』
「というわけで次回」
< Version 15.22 「プロジェクトの設定」コンパイル編(2) >
『につづく!』
「元々全然計算しないで始めてるんだから、何を今さら!!」
『何泣きながら言ってるの』