|   | 
  | 
連載
改訂版 プロフェッショナル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 記事ランキング
		
		
			本日
			月間