2008-08-19 8 views
15

#defineと#ifステートメントを使うためにインスタンスが送信されるのは不思議です。私はしばらくそれについて知っていましたが、コーディングの方法にそれを組み込んだことはありませんでした。コンパイルにどの程度正確に影響しますか?#defineはどのように使用しますか?

コンパイル時にコードが含まれているかどうかを判断するのは#defineだけですか? #define DEBUGmeをカスタムシンボルとして使用している場合、コンパイルから除外する唯一の方法は、この#define文を削除することです。

答えて

12

C##defineマクロでは、Bernardの例のようにマクロは使用できません。 C#での#define/#ifの唯一の一般的な使用は、オプションのデバッグ専用コードの追加です。たとえば:

 static void Main(string[] args) 
     { 
#if DEBUG 
      //this only compiles if in DEBUG 
      Console.WriteLine("DEBUG") 
#endif 
#if !DEBUG 
      //this only compiles if not in DEBUG 
      Console.WriteLine("RELEASE") 
#endif 
      //This always compiles 
      Console.ReadLine() 
     } 
1

よく定義されているのは、コンパイル時定数やマクロでよく使われます。実際には関数呼び出しがないため、これによりコードが少し速くなります。マクロの出力値はコンパイル時に決定されます。 #ifは非常に便利です。私が考えることができる最も簡単な例は、いくつかの余分なログやメッセージングを追加するデバッグビルドをチェックすることです。また、このように異なる環境変数をチェックすることもできます。

もっとC/C++の経験が多い方は、私は確信しています。

1

特定の機能で繰り返し実行されることがあることがよくあります。これにより、コードが大幅に短縮され、よりよい概要が得られます。

しかし、いつものように、新しい言語を作成しないという良い方法を見つけようとします。後で時々のメンテナンスのために読むのは少し難しいかもしれません。

8

の#defineは、あなたは、コードのビットを含むか除外するの#ifで使用できるコンパイル時の定数を定義するために使用されます。

#define USEFOREACH 

#if USEFOREACH 
    foreach(var item in items) 
    { 
#else 
    for(int i=0; i < items.Length; ++i) 
    { var item = items[i]; //take item 
#endif 

     doSomethingWithItem(item); 
    } 
1

@Ed:C++を使用する場合、マクロを作成するときに#defineを使用してインライン関数を使用する利点はほとんどありません。 「より速い」という考え方は誤解です。インライン関数では同じ速度が得られますが、型セーフビーがあり、関数が呼び出される前にパラメータが評価されているため、プリプロセッサの「貼り付け」の副作用はありません(例として、ユビキタスMAXマクロこれをMAX(x ++、y)..と呼んでください。あなたは私が何を得ているか見るでしょう)。

私はC#で#defineを使用する必要がありませんでしたが、それ以外のプラットフォームやコンパイラのバージョンチェックでC++の条件付きコンパイルを行うことはめったにありません。

3

は、コンパイル時にコードが が含まれている場合 が判断した唯一のものに#defineですか? #define DEBUGmeをカスタムシンボルとして使用している場合は、 コンパイルから除外する方法は この#define文を削除するだけですか?

することはできundefineシンボルだけでなく

#if defined(DEBUG) 
#undef DEBUG 
#endif 
0

C#での#defineのおそらく最も一般的なuseesは、たとえば、WindowsとではX-Boxの360のために(デバッグ/リリースと異なるプラットフォーム間で区別することですXNAフレームワーク)。

0

プロジェクトに基づいてコードのビットを含めるか、または削除することができますので、それをする傾向がどの属性、条件付きコンパイルのためです:

プラットフォーム(Windowsの/ Linuxの/ XB360/PS3/iPhoneの....などを対象
  • リリースまたはデバッグ(一般的にはログイン、などを主張するだけでデバッグビルドに含まれています)

彼らはまた、ゲームの開発中に、すばやく例えば のシステムの大部分を無効にするために使用することができます、私は定義するかもしれない

#define PLAYSOUNDS 

、その後でサウンドを再生するには、最終的な呼び出しをラップ:

#ifdef PLAYSOUNDS 
// Do lots of funk to play a sound 
return true; 
#else 
return true; 

私は、ビルドのために音の演奏にしてオフにするためにだから、それは非常に簡単です。 (通常、私は個人的な音楽のためにデバッグするときにサウンドを再生しません) ifステートメントを追加してブランチを導入していないという利点があります。

関連する問題