C#プリプロセッサディレクティブ完全ガイド:条件付きコンパイルと診断制御
C#プリプロセッサディレクティブをマスターする
C#プリプロセッサディレクティブがコンパイル制御、条件分岐、エラー処理をどう形作るかを解説。各ディレクティブの構文、実例、ベストプラクティスを網羅します。
プリプロセッサディレクティブは、実際のコンパイルが始まる前にコンパイラが評価する命令です。どのコードセクションを含めるか、警告やエラーをどう扱うか、さらにはコンパイラの行番号やファイル名認識を変更することさえ可能です。
C#では、ディレクティブは # 記号で始まり、1行で完結し、セミコロンではなく改行で終端されます。
| ディレクティブ | 説明 | 構文 |
|---|---|---|
#if | プリプロセッサ式を評価し、真の場合のみコードを含める | #if expression code #endif |
#elif | #if に続いて追加の式をテスト | #if expr1 code1 #elif expr2 code2 #endif |
#else | 先行する #if / #elif がすべて偽のときに実行 | #if expr1 code1 #else code2 #endif |
#endif | 条件ブロックの終了 | #if expr code #endif |
#define | 新しいシンボルを定義 | #define SYMBOL |
#undef | 定義済みシンボルを削除 | #undef SYMBOL |
#warning | レベル1のコンパイラ警告を生成 | #warning Your warning message |
#error | コンパイル時エラーを発生させる | #error Your error message |
#line | 診断用の行番号とファイル名を上書き | #line 50 "FakeProgram.cs" #endif |
#region | エディタで折りたたみ可能な領域を作成 | #region Description code #endregion |
#pragma | コンパイラへ特別な指示(警告の有効/無効など) | #pragma warning disable #endif |
シンボルの定義と未定義
- #define:
#ifブロックで真と評価されるシンボルを作成 - #undef: シンボルを削除し、偽と評価されるようにする
実例: シンボルの定義
#define TESTING
実例: シンボルの未定義
#undef TESTING
#if, #elif, #else, #endif による条件付きコンパイル
#ifは式をテストし、真の場合のみ内部コードをコンパイル- 式には論理演算子(
&&,||,!)とシンボルが使用可能 #elifで複数条件を順次テスト#elseで前条件すべて不成立時の処理を指定#endifで条件ブロックを終了
実践例
#define CSHARP
#undef PYTHON
using System;
namespace Directive {
class ConditionalDirective {
static void Main(string[] args) {
#if (CSHARP && PYTHON)
Console.WriteLine("CSHARP and PYTHON are defined");
#elif (CSHARP && !PYTHON)
Console.WriteLine("CSHARP is defined, PYTHON is undefined");
#elif (!CSHARP && PYTHON)
Console.WriteLine("PYTHON is defined, CSHARP is undefined");
#else
Console.WriteLine("CSHARP and PYTHON are undefined");
#endif
}
}
}
出力: CSHARP is defined, PYTHON is undefined
警告とエラーの生成
#warning: ユーザー定義のコンパイラ警告を出すが、プログラムは継続#error: 致命的エラーを出し、コンパイルを停止
警告の例
using System;
namespace Directives {
class WarningDirective {
public static void Main(string[] args) {
#if (!CSHARP)
#warning CSHARP is undefined
#endif
Console.WriteLine("#warning directive example");
}
}
}
警告行が出力されますが、コンソールテキストも表示されます。
エラーの例
using System;
namespace Directive {
class Error {
public static void Main(string[] args) {
#if (!CSHARP)
#error CSHARP is undefined
#endif
Console.WriteLine("#error directive example");
}
}
}
出力: ビルドがコンパイル時エラーで失敗し、最後のコンソール行は実行されません。
#line で診断位置をカスタマイズ
- 以降の警告/エラーで報告される行番号とファイル名を変更
実例
using System;
namespace Directive {
class LineDemo {
public static void Main(string[] args) {
#line 200 "AnotherProgram.cs"
#warning Actual warning generated by Program.cs on line 10
}
}
}
結果: 警告が AnotherProgram.cs(200,22): warning CS1030: ... として表示されます。
#region と #endregion でコードを整理
- 関連コードブロックをグループ化し、エディタで折りたたみ可能に
- 別の
#regionと重複不可だが、条件ブロック内には配置可能
実例
using System;
namespace Directive {
class RegionDemo {
public static void Main(string[] args) {
#region Hello
Console.WriteLine("Hello");
Console.WriteLine("Hello");
Console.WriteLine("Hello");
Console.WriteLine("Hello");
Console.WriteLine("Hello");
#endregion
}
}
}
出力: "Hello" が5行表示されます。
#pragma で高度なコンパイラ制御
- コンパイラ動作を細かく制御
- 主な用途:
#pragma warning disable– すべての警告を無効化#pragma warning restore– 警告を再有効化- 特定の警告番号を指定可能(例:
#pragma warning disable CS0168) #pragma checksum– デバッグ用チェックサム生成
実例
using System;
namespace Directive {
class PragmaDemo {
public static void Main(string[] args) {
#pragma warning disable
#warning This is a warning 1
#pragma warning restore
#warning This is a warning 2
}
}
}
2つ目の警告のみ表示されます。
詳細は公式 #pragma (C# リファレンス) を参照してください。
C言語
- 3Dプリンティング vs CNC加工:プロジェクトに適したツール選び
- CNC加工におけるSFMとは? 表面速度の意味と計算方法
- C# キーワードと識別子:ルール、一覧、ベストプラクティス完全ガイド
- C++変数・リテラル・定数完全ガイド:基礎から実践まで
- C++データ型完全ガイド:基本型、修飾子、ベストプラクティス
- C言語キーワードと識別子:実践ガイド
- C言語データ型完全解説:int、float、charなど
- C言語プリプロセッサ(CPP)の理解:コンパイルをシンプルにする仕組み
- Python キーワードと識別子: 予約語と命名規則をマスター
- Python正規表現(reモジュール)実践ガイド
- Pythonのtimeモジュールをマスター:関数、構造体、実践例