|
|
連載
改訂版 プロフェッショナルVB.NETプログラミング
Chapter 16 プリプロセッサ
株式会社ピーデー
川俣 晶
2004/10/07 |
|
VB.NETには「プリプロセッサ」という機能が追加されている。これは、コンパイル処理の本体が実行される前に実行される機能で、ソース・コードの構造と独立して、ソース・コードに関する指示を埋め込むことを可能にする。C言語などで便利に使われている機能が、VB.NETにも付け加えられたことになるが、内容は同じではない。また、C言語のプリプロセッサにはない、領域指定の機能などもある。実用性の高い機能ゆえに、開発現場で使われる機会も多いので、学んでおく価値があるだろう。
プリプロセッサの中で、最も利用頻度が高いものは、条件付きコンパイル機能だろう。リスト16-1は、DebugビルドとReleaseビルドで異なるコードを使用するサンプル・プログラムである。
1: Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
2: #If Debug Then
3: Trace.WriteLine("Debug Build")
4: #Else
5: Trace.WriteLine("Release Build")
6: #End If
7: End Sub
|
|
リスト16-1 条件付きコンパイル機能を使用したプログラム
|
これをDebugビルドで実行すると以下のような結果になる。
|
リスト16-2 リスト16-1の実行結果(Debugビルドで実行した場合)
|
また、Releaseビルドで実行すると以下のような結果になる。
|
リスト16-3 リスト16-1の実行結果(Releaseビルドで実行した場合)
|
ビルドによって結果に差が出るのは、Debugビルドの場合とReleaseビルドの場合とで、異なるソース・コードの行がコンパイルされているためである。つまり、ビルドの差は、実行時に判定されるのではなく、ビルド時に判定されている。
具体的に、ある範囲のソース・コードをビルド対象としたり、対象から外したりするために、#If、#Else、#ElseIf、#End Ifの4つのディレクティブが使用される。リスト16-1の2、4、6行目がそれに当たる。もし、2行目に記述された条件が成立していれば、2行目と4行目の間がビルドされ、そうでないときは、4行目と6行目の間がビルドされる。
2行目で示されている条件は定数式である。ここでは、Debugというシンボルが判定の対象になっている。これは、コンパイラが提供している条件付きコンパイル定数で、DebugビルドのときにTrueになるという機能を与えられている。これは、プロジェクトのプロパティでカスタマイズできる。
|
●図16-4 プロジェクトのプロパティにある条件付きコンパイル定数の設定 |
このダイアログボックスでDEBUG定数の定義のチェックを外すと、DebugビルドでもDebugの値はTrueにならず、Releaseビルドと同じ実行結果になる。
条件付きコンパイルステートメントで条件判断に使用する定数は、通常の定数ではなく、条件付き定数と呼ばれるものである。#Constディレクティブを使うと、条件付き定数を定義することができる。リスト16-5に、#Constディレクティブを使用したサンプル・プログラムを示す。
1: #Const SWITCH1 = True
2: #Const SWITCH2 = False
3:
4: Public Class Form1
5: Inherits System.Windows.Forms.Form
6:
7: …Windows フォーム デザイナで生成されたコード…
8:
9: Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
10: #If SWITCH1 Then
11: Console.WriteLine("SWITCH1はオンです")
12: #Else
13: Console.WriteLine("SWITCH1はオフです")
14: #End If
15: #If SWITCH2 Then
16: Console.WriteLine("SWITCH2はオンです")
17: #Else
18: Console.WriteLine("SWITCH2はオフです")
19: #End If
20: #If SWITCH3 Then
21: Console.WriteLine("SWITCH3はオンです")
22: #Else
23: Console.WriteLine("SWITCH3はオフです")
24: #End If
25: End Sub
26: End Class
|
|
リスト16-5 #Constディレクティブを使用したプログラム
|
これを実行すると以下のようになる。
1: SWITCH1はオンです
2: SWITCH2はオフです
3: SWITCH3はオフです
|
|
リスト16-6 リスト16-5の実行結果
|
1行目と2行目が、#Constディレクティブを使用した例である。1行目で条件付き定数SWITCH1はTrueに、SWITCH2はFalseに設定している。これにより、10行目の条件判断は真になり、15行目の条件判断は偽となる。その結果、11行目と18行目がコンパイルされ、13行目と16行目はコンパイルされない。
気になるのは、20行目で使用されているSWITCH3というシンボルである。これはどこにも定義されていない。定義されていない条件付き定数は、Nothingという値であると仮定されて処理される。そして、NothingはBoolean型に変換されるとFalse扱いなので、「偽」という判定結果になる。
条件付き定数は、#Constディレクティブを使用するほかに、プロジェクトのプロパティとして設定する方法もある。#Constディレクティブを使用する場合は、#Constディレクティブを記述したソース・ファイルの、それ以降でのみ値が有効になるが、プロジェクトのプロパティとして設定すると、プロジェクト中のすべてのソース・ファイルの、すべての行で有効になる。設定するには、プロジェクトのプロパティの中で、条件付きコンパイル定数のカスタム定数の部分に定義を書き込む(図16-7)。
|
●図16-7 #Constディレクティブの代わりに、プロジェクトのプロパティで設定したカスタム定数 |
INDEX |
|
[連載] 改訂版 プロフェッショナルVB.NETプログラミング |
|
Chapter 16 プリプロセッサ |
|
1.条件付きコンパイル/条件付き定数 |
|
2.領域ディレクティブ |
|
業務アプリInsider 記事ランキング
本日
月間