連載

改訂版 プロフェッショナルVB.NETプログラミング

Chapter 16 プリプロセッサ

株式会社ピーデー 川俣 晶
2004/10/07
Page1 Page2


 本記事は、(株)技術評論社が発行する書籍『VB6プログラマーのための入門 Visual Basic .NET 独習講座』の一部分を許可を得て転載したものです。同書籍に関する詳しい情報については、本記事の最後に掲載しています。

 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ビルドで実行すると以下のような結果になる。

1: Debug Build
リスト16-2 リスト16-1の実行結果(Debugビルドで実行した場合)

 また、Releaseビルドで実行すると以下のような結果になる。

1: Release Build
リスト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.領域ディレクティブ
 
「改訂版 プロフェッショナルVB.NETプログラミング 」


Insider.NET フォーラム 新着記事
  • 第2回 簡潔なコーディングのために (2017/7/26)
     ラムダ式で記述できるメンバの増加、throw式、out変数、タプルなど、C# 7には以前よりもコードを簡潔に記述できるような機能が導入されている
  • 第1回 Visual Studio Codeデバッグの基礎知識 (2017/7/21)
     Node.jsプログラムをデバッグしながら、Visual Studio Codeに統合されているデバッグ機能の基本の「キ」をマスターしよう
  • 第1回 明瞭なコーディングのために (2017/7/19)
     C# 7で追加された新機能の中から、「数値リテラル構文の改善」と「ローカル関数」を紹介する。これらは分かりやすいコードを記述するのに使える
  • Presentation Translator (2017/7/18)
     Presentation TranslatorはPowerPoint用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)
- PR -

注目のテーマ

業務アプリInsider 記事ランキング

本日 月間
ソリューションFLASH