プリプロセッサとは何か
プリプロセッサとは、コンパイルの前に処理を行う機能である。そのため厳密にいうと、プリプロセッサの機能はプログラム言語の機能の一部ではない。しかし、通常は両者が一体となって処理されるので、プログラム言語の一部と考えても問題はない。さて、早速プリプロセッサが使われる例をみてみよう。
1: using System;
2:
3: namespace ConsoleApplication3
4: {
5: class Class1
6: {
7: static void Main(string[] args)
8: {
9: #if DEBUG
10: Console.WriteLine("DEBUG build");
11: #else
12: Console.WriteLine("RELASE build");
13: #endif
14: }
15: }
16: } |
|
プリプロセッサの機能を使用したサンプル・プログラム1 |
“#”で始まる行がプリプロセッサへの命令である。 |
これを実行すると以下のようになる。
|
サンプル・プログラム1の実行結果 |
実行ファイルのフル・パスを見て分かるように、このプログラムはデバッグ・ビルドとリリース・ビルドでは同じ結果にならない。
|
実行結果を見て分かるとおり、このサンプル・ソースは、(Visual Studio .NETの)デバッグ・ビルドとリリース・ビルドでは、同じ実行結果にならない。普通なら、デバッグ・ビルドとリリース・ビルドで結果が違うというのはコンパイラの欠陥を意味するのだが、これは違う。このサンプル・ソースは、明示的にビルドの方法に応じて、結果が異なるように指示を記述しているからだ。このように、ビルドの方法に応じて処理内容を一部変更したい、というニーズはしばしば発生する。例えば、デバッグ情報の出力は、デバッグ・ビルドの場合に限りたい、といった事情があるときだ。
9、11、13行目の「#if」、「#else」、「#endif」は、プリプロセッサへの命令である。#ifに続いて記述された条件が成立する場合は、#ifと#elseの間がコンパイルされ、そうでないときは#elseと#endifの間がコンパイルされる。ここで条件として指定されているものは、9行目の#ifに続いて記述されているDEBUGである。DEBUGとは、デバッグ・ビルドの際に自動的に定義されるシンボルである。単にシンボル名を記述すると、そのシンボルが定義されているかどうかが判定される。その結果、9行目の#ifは、DEBUGというシンボルが定義されているかどうかを判定することになる。それは結果的にデバッグ・ビルドかどうかを判定することになる。
ちなみに、リリース・ビルドの時に定義されるシンボルというのはデフォルト状態では存在しないので、“#if RELEASE”のように記述しても機能しない。
条件を自分でコントロールする
デバッグ・ビルドとリリース・ビルドを区別するシンボルDEBUGは、Visual Studio .NETのIDEが自動的に用意してくれるので、何の準備もなく利用できる。しかし、自分でシンボルを用意することもできる。例えば、製品版と体験版を切り替えるためのシンボルを用意する、ということができる。
シンボルDEBUGの定義は、プロジェクトのプロパティを開くと、以下のように「条件付きコンパイル定数」として定義されていることを確認できる。
|
[プロパティページ]ダイアログ |
[ソリューションエクスプローラ]でプロジェクトを選択した後、[プロジェクト]メニューの[プロパティ]で開くことができる。 |
自分で追加のシンボルを用意したいときは、ここにカンマで区切って続けて入力すればよい(IDEを使わないときは、コンパイラのコマンドライン引数で指定する)。
|
[プロパティページ]ダイアログでシンボルを追加する |
[条件付きコンパイル定数]の部分に自分でシンボルを追加することができる。
|
こうして定義したシンボルは、もちろん、ソースコード中の#ifで参照できる。以下はいま追加した“MY_COMPILE_SWITCH”を参照してみたサンプル・ソースである。
1: using System;
2:
3: namespace ConsoleApplication4
4: {
5: class Class1
6: {
7: static void Main(string[] args)
8: {
9: #if MY_COMPILE_SWITCH
10: Console.WriteLine("MY_COMPILE_SWITCH on");
11: #else
12: Console.WriteLine("MY_COMPILE_SWITCH off");
13: #endif
14: }
15: }
16: } |
|
定義したシンボルを参照するサンプル・プログラム2 |
シンボル“MY_COMPILE_SWITCH”は[プロパティページ]ダイアログで追加したもの。 |
これを実行すると以下のようになる。
|
サンプル・プログラム2の実行結果 |
ダイアログで定義したシンボルにマッチする部分がコンパイルされているのが分かる。
|
なお、シンボルが定義されていない状態にするには、単にプロジェクトのプロパティにシンボルを書かなければよい。
Insider.NET 記事ランキング
本日
月間