連載

C#入門

第19回 プリプロセッサとドキュメント

(株)ピーデー
川俣 晶
2002/01/11


プリプロセッサとは何か

 プリプロセッサとは、コンパイルの前に処理を行う機能である。そのため厳密にいうと、プリプロセッサの機能はプログラム言語の機能の一部ではない。しかし、通常は両者が一体となって処理されるので、プログラム言語の一部と考えても問題はない。さて、早速プリプロセッサが使われる例をみてみよう。

 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の実行結果
ダイアログで定義したシンボルにマッチする部分がコンパイルされているのが分かる。

 なお、シンボルが定義されていない状態にするには、単にプロジェクトのプロパティにシンボルを書かなければよい。

 

 INDEX
  第19回 プリプロセッサとドキュメント
  1.プリプロセッサとは何か
    2.ソースにシンボルの定義を埋め込む
    3.複雑な条件の指定
    4.自作のエラーや警告を発する
    5.XMLドキュメントの埋め込み
    6.利用できるさまざまな要素
 
「C#入門」


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メールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Insider.NET 記事ランキング

本日 月間