Version 15.23
「プロジェクトの設定」コンパイル編(3)
「今回は、前回に続いて【プロジェクトの設定】ダイアログについて説明し
ます」
『前回は【C/C++】の【プリコンパイル済みヘッダー】までね。結構複雑だ
ったなー』
「今回はC/C++の残りを見ていきます。まず【プリプロセッサ】」
『プリプロセッサってマクロとかのだよね』
「そう、 Version 6.05 ( No.105 ) でやったね。プリプロセッサは、
コンパイル前に行う処理のこと。そのあたりの設定とかをここでします」
『まず最初の【プリプロセッサの定義】だけど……これって【一般】のと同
じじゃないの?』
「まったく同じ。【一般】の設定がそのままここに出ています」
『前回した〈AAA=300〉もある。これってどっちで設定しても同じ?』
「同じ。 Version 15.21 ( No.321 ) で説明したように、この設定も、結局
プロジェクトのオプションで設定しているだけだから」
『両方とも同じオプションってことね』
「そういうこと。次の【次のシンボルを無効にする】と【すべて無効にする】
は、【定義済みマクロ】っていう、 Visual C++ に組み込まれているマクロ
を無効化するもの」
『定義済みマクロ?』
「定義済みマクロの一覧は /U オプションのページに書かれているのでそち
らを参照。たとえば、定義済みマクロのひとつに _MSC_VER があります。こ
のマクロは〈コンパイラのバージョン番号〉に置き換えられます」
『置き換えられる……?』
「たとえば、コンパイラのバージョン番号が1200であれば」
#define _MSC_VER 1200
「みたいになってる、ってこと」
『あ、なるほど』
「だから、次のようにできます」
int iVersion = _MSC_VER;
「【次のシンボルを無効にする】にこの _MSC_VER を書き込むと、これが無
効になります」
『うわ、それ書き込んでリビルドしたら、なんか警告出まくった!』
「このマクロは Visual C++ の各インクルードファイルでも使用しているか
らね。【すべて無効にする】をオンにすると、すべての定義済みマクロが使
えなくなります」
『うわ、さらに大量のエラーが!!』
「この設定をする場合には、 Visual C++ 付属のヘッダーファイルを使わな
いで、すべて自分で作成したファイルだけでプログラムを作る場合に、定義
済みマクロが邪魔、っていう場合にのみ使用することになるかな」
『普通に使っていたら使わないってことね』
「次の【インクルードファイルのパス】は、インクルードファイルを探しに
いくフォルダを指定指定します」
『これはなんども使ったね』
「 Version 15.07 ( No.307 ) とかで使ったね。 DLL のヘッダーファイル
のように、外にあるヘッダーファイルを参照する場合に使用します」
『メニューの【ツール】-【オプション】で指定するのでもいいんだよね』
「基本的には同じ。オプションの場合はずっと残るけど、プロジェクトの
設定の場合はプロジェクト単位だから……」
・そのプロジェクトでしか使用しない→プロジェクトの設定
・あらゆるプログラムで使用する →オプション
「って使い分けるのがいいかな」
『最後の【標準インクルード パスを無視する】は?』
「これは【環境変数】っていうのと関係があります」
『かんきょうへんすう?』
「環境変数っていうのは、 OS そのものの変数」
『…… OS に変数なんてあるの?』
「実はあるんです。普段はあまり使わないんだけど。環境変数が設定されて
いるところを見ておこうか。コントロールパネルを開いて」
『コントロールパネルだね』
「その中の【システム】をダブルクリックして、【詳細】ページを開いて」
『開いたよ。あ、環境変数ってある!』
「その【環境変数】ボタンを押して」
『【環境変数】ダイアログが出た。【変数】とか【値】とかある』
「ここでは、環境変数を指定することができます。上の方の【新規】ボタン
を押して」
『【新しいユーザー変数】ダイアログが出た』
「ここには次のように入力してください」
変数名:
AAA
変数値:
BBB
「これでOKボタンを押して閉じて、さらに【環境変数】ダイアログもOK
ボタンを押して閉じてください」
『これで環境変数がセットされた?』
「されました。環境変数 AAA に、値"BBB"が格納されたことになります」
『文字列が変数 AAA に入った、ってこと?』
「そういうこと。型とかはないから、基本的に文字列を入れるものって
思って。これをプログラムで取得してみましょう。まず…… Visual C++ を
一度終了させて、再実行して」
『え? 一度閉じるの?』
「そう。環境変数ってそうしないと更新されないから」
『不便……』
「起動したら、以下のプログラムを試してください」
// Main.cpp
#include <Windows.h>
int WINAPI WinMain
( HINSTANCE p_hInstance
, HINSTANCE p_hPrevInstance
, LPSTR p_pchCmdLine
, int p_iCmdShow
)
{
char pch[1024];
GetEnvironmentVariable( "AAA", pch, 1024 );
OutputDebugString( pch );
// BBB
return 0;
}
「環境変数の取得は GetEnvironmentVariable() という API で行います。
GetEnvironmentVariable() の第1引数で、環境変数の変数名を指定すると、
第2引数に値が格納されます」
『さっき入れた BBB が出力された!』
「このように、環境変数は【 OS の変数】として使用できます。まぁ実際に
はただの設定なんだけど」
『変数ってほどのもんでもないのね』
「 Windows は特にね。他の OS の場合には本当に変数として使用すること
も多いけど、 Windows なら文字列定数って考えた方がいいかも」
『で、設定はどう関わってくるの?』
「そうそう、実はインクルードファイルって、環境変数の PATH と INCLUDE
で指定したフォルダも探していたんだけど、それをしなくなります」
『そんなものでも指定していたんだ』
「 Visual C++ 6.0 の場合にはこの環境変数は使わないから、プログラマー
が使ったりしない限り問題ないかな」
『この辺も結局あまり関係ないってことね』
「では最後のページ、【最適化】について」
『前もちょっと出てきたよね』
「最初の【一般】ページにある【最適化】と、この【最適化】ページにある
【最適化】は同じオプションだから」
『えっと、全部上げると……』
・デフォルト
・無効(デバッグ時)
・実行速度
・プログラムサイズ
・カスタマイズ
『ってあるね』
「このうち、【デフォルト】と【無効(デバッグ時)】は同じ、まったく
最適化をしません」
『何もしない時はこれね』
「【実行速度】は、コンパイル時に実行速度が一番早くなるように
コンパイルします」
『コンパイル時に?』
「そう、この最適化の設定はコンパイル時に〈コンパイル後のプログラム〉
を最適な形に書き換える設定のこと」
『へー、コンパイルした時にそういうことができるんだ』
「日本語から英語へ訳す例に置き換えるなら、〈はい〉を〈Yes, I do〉と
訳すのが【デフォルト】、〈Yes〉に置き換えるのが【実行速度】、ってと
ころかな」
『……【プログラムサイズ】じゃないの?』
「それはあるかも。【プログラムサイズ】は、コンパイル後の Exe の
サイズが小さくなるように最適化されるんだけど、それが同時に、実行速度
の最適化になる場合もあるから」
『あ、そういうこともあるんだ』
「で、【実行速度】も【プログラムサイズ】も、結局は【カスタマイズ】の
設定をいくつか組み合わせたものなんです」
『つまり、もっと細かく最適化したい場合には【カスタマイズ】ってこと
ね』
「そういうこと。ただ……」
『ただ?』
「最適化は勧めません」
『え、そうなの?』
「さっきの日本語から英語への訳の例で言うと、最適化することで〈誤訳〉
しちゃう場合があるんだよね」
『誤訳!?』
「最適化がうまくいかなくて、逆にバグが生まれる場合があるんです」
『それまずいじゃん!』
「そう、だから僕は最適化は勧めません。実際、【実行速度】はそれほど早
くならないし、【プログラムサイズ】も、今のインターネットの環境とか
ハードディスクのサイズとかを考えたら、気にするようなものじゃないし」
『確かにねー』
「だから最適化は、デバッグ時は【無効(デバッグ時)】、リリース時は
【デフォルト】がいいかな」
『結局そうなるのね。あ、一番下にもひとつある』
「最後の【関数のインライン展開の制御】っていうのは、 inline っていう
のを付けた関数【インライン関数】の話」
// Main.cpp
#include <Windows.h>
inline void InlineTest()
{
OutputDebugString( "AAA\n" );
}
int WINAPI WinMain
( HINSTANCE p_hInstance
, HINSTANCE p_hPrevInstance
, LPSTR p_pchCmdLine
, int p_iCmdShow
)
{
InlineTest();
return 0;
}
『? 普通の関数と違うの?』
「ほとんど同じ。違うのは、呼び出し元に〈埋め込まれる〉という点」
『埋め込まれる!?』
「そう、呼び出すんじゃなくて」
『なんかマクロみたい』
「そうだね、マクロの代わりとして作られたものだから。 C++ で追加され
たものだからね。ただ、今のオプションで【無効】を選択すると、埋め込ま
れません」
『あれ、意味ないね』
「しかも、他の設定をしても、必ず埋め込まれるとは限りません」
『……なんかあんまり意味ないね』
「だから、 inline 関数自体あまり使われないし、【無効】でいいんじゃな
いかな」
/*
Preview Next Story!
*/
『ふぅ、やっとコンパイルのが終わった』
「というわけで次回はリンク編」
『まだ続くの〜?』
「リンク編ではリンク時の設定、 Exe の設定をします」
『コンパイル編より難しい?』
「同じくらい」
『ほんとに〜?』
「というわけで次回」
< Version 15.24 「プロジェクトの設定」リンク編(1) >
『につづく!』
「難しすぎたら省略するから」
『ダメジャン』