C# で使えるプリプロセッサディレクティブの紹介!【region, pragma など】

C#で使えるプリプロセッサディレクティブの紹介!

C# のコードで #region#endregion の記載を見かけることがあります。

Unity 開発においては、デバッグ時に実行したいコードを #if DEBUG ~ #endifで囲んだりします。

このような#から始まるシンボルはプリプロセッサディレクティブと呼ばれ、上記だけではなく他にも数多くの種類が存在します。本記事ではC#のコーディング時に使えるディレクティブをいくつか紹介します。

#region ディレクティブ:範囲を定義

#region#endregion で囲むことで範囲を定義できます。

この2つはお互いの存在を確認するだけでその他は何もしません。2つが揃っていないとコンパイルエラーが発生します。

以下のように#region から#endregionで囲まれたコードは VSCode 上などで折りたたむことが可能です。

regionディレクティブ

#warning ディレクティブ:警告を出す

#warning ディレクティブを使うことで強制的にコンパイラの警告を出せます。

記載方法は#warning のあとに警告に出したいメッセージを記載するだけです。

warningディレクティブのコード

Unity のコンソールを確認すると、警告が表示されるようになりました。

warningディレクティブによる警告

#error ディレクティブ:エラーを出す

#error ディレクティブを使うことで強制的にコンパイルエラーを発生させます。

記載方法は#errorのあとにエラー文を記載するだけです。

errorディレクティブのコード

Unity のコンソールを確認すると、コンパイルエラーが発生しました。

errorディレクティブによるコンパイルエラー

#line ディレクティブ:警告やエラーの行番号を指定

#line ディレクティブを使うと、コンパイル時に出力されるエラーや警告メッセージに行番号やファイル名を指定できます。

#line 行番号

使い方は#line [行番号] [ファイル名] です。
例えば以下のように SampleClass 内に #line 20 "TestClass.cs" と記載します。

public class SampleClass
{
	public static void Main()
	{
#line 20 "TestClass.cs"
		int a;
	}
}

コンパイル結果を確認すると、本来 SampleClass 内で起こる警告が TestClass.cs の 20 行目への警告として表示されました。

lineディレクティブによる警告

#line default

#line default は、指定した行の番号を既定の番号に戻します

例えば以下の場合、#line default 記載以降の行番号は規定の行番号に戻ります。

public class SampleClass
{
	public static void Main()
	{
#line 20 "TestClass.cs"
		int a;
		int b;
#line default
		int c;
	}
}

コンパイル結果は以下の通りです。2つ目までの int a;int b;への警告は、行番号が 20, 21行目と指定した行からの番号となっていますが、3つ目の int c; への警告は、規定の行番号である 9行目に戻っているのが分かります。

line default による警告

#pragma ディレクティブ:特別な命令をコンパイラに指示

#pragma ディレクティブを使うことでコンパイルに関する特別な命令をコンパイラに指示します。

#pragma には、特定の警告を有効または無効にする#pragma warningと、 ASP.NET ページのデバッグに使用するソースファイルのチェックサムを生成する#pragma checksumが存在します。

#pragma warning

#pragma warning disable [警告番号] で指定した番号の警告を無効にします。

#pragma warning restore [警告番号] で指定した番号の警告を有効にします。

pragma warning のサンプル

参考資料