C#の#if、#elif、#else、#endifなどの条件コンパイル記号(転載)


これらはC#の条件付きコンパイル記号です.これらの命令は私がプロジェクトで出会ったことがあります.ネットを調べて、人に聞いたことがあります(もちろん、牛も牛も知らないので、収穫はありません).今日は資料をめくって、この方面に言及したものがあるので、この文章を見ることができる人と一緒に勉強します.
C#のdefine前処理命令では置換定数を定義できません.この命令は、条件コンパイルに使用されるシンボルのみを定義し、#if、#elif、#elseおよび#endifに使用されます.
ソースファイルは、コンパイルする前にファイル処理を1回行います.これはプリプロセッサによって行われます.このファイル処理は、ソースファイルのみをテキスト処理し、コンパイル動作を行わない.すべての前処理命令は「#」記号で始まる.
 
前処理は以下の命令を識別し、以下の命令を識別する.
#define #undef #if #elif  #else  #endif #error  #warning #line #region #endregion
#pragma warning disable       #pragma warning restore

#if#elif#else#endifコマンドは、#defineコマンドを使用して、プリプロセッサに元のコードの変更を指示するシンボルの動作を定義することができます.次に、条件を使用してコンパイルした例を示します.
#define MACRO1
using System;

public class Program
{
 public static void Main()
 {
   #if (MACRO1)
   console.writeline("MACRO1 is defined.");
   #elif (MACRO2)
   console.writeline("MACRO2 is defined and MACRO1 is not defined");
   #else
   console.writeline("MACRO2  and MACRO1 are both defined");
   #endif
 }
}

vsを使用すると、開発環境ではコンパイルされていないコードがグレー表示されます.シンボル定数はusing命令の前に定義する必要があります.
 
補足:
#ifでは、条件コマンドを開始し、1つ以上のシンボルをテストしてtrueとして計算されているかどうかを確認できます.それらの計算結果がtrueである場合、コンパイラは#ifと最近の#endif命令の間にあるすべてのコードを計算します.たとえば、
#if DEBUG  
            string file = root + "/conf_debug.xml";  
#else  
            string file = root + "/conf.xml";  
#endif  

このコードは通常のようにコンパイルされますが、debugプロファイルを読み込むには#if句に含まれます.この行のコードは、前の#defineコマンドでシンボルDEBUGが定義されている場合にのみ実行されます.コンパイラが#if文に遭遇すると、関連する記号が存在するかどうかを確認し、記号が存在する場合は#ifブロックのコードのみをコンパイルします.そうでない場合、コンパイラは一致するendifコマンドに遭遇するまで、すべてのコードを無視します.デバッグ時に符号DEBUGを定義し、異なるデバッグ関連コードを#if句に入れるのが一般的です.デバッグが完了したら、#define文をコメントすると、すべてのデバッグコードが奇跡的に消え、実行可能ファイルも小さくなり、エンドユーザーはこれらのデバッグ情報に混乱しません(明らかに、より多くのテストを行い、コードがDEBUGを定義していない場合でも動作することを確保します).この技術はCとC++プログラミングにおいて非常に一般的であり,条件コンパイル(conditional compilation)と呼ばれている.
 
参考文献:
C#の#if、#elif、#else、#endifなどの条件コンパイル記号
C##if,#elif,#elseおよび#endif前処理命令
 
転載先:https://www.cnblogs.com/OpenCoder/p/9827095.html