#pragma twice

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

#pragma twice 323 Version 15.23 「プロジェクトの設定」コンパイル編(3)

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

 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) >
につづく!
難しすぎたら省略するから
ダメジャン
 
del.icio.us 登録する
Yahoo!ブックマーク 詳細を表示 users
livedoorクリップ 詳細を表示 livedoorクリップ ブックマーク数
はてなブックマーク 詳細を表示 はてなブックマーク ブックマーク数
RSSに登録
del.icio.us 登録する
Yahoo!ブックマーク 詳細を表示 users
livedoorクリップ 詳細を表示 livedoorクリップ ブックマーク数
はてなブックマーク 詳細を表示 はてなブックマーク ブックマーク数
 
このページは、Visual C++ 6.0を用いた C++ 言語プログラミングの解説を行う#pragma twiceの一コンテンツです。
詳しい説明は#pragma twiceのトップページをご覧ください。