2008-08-19 114 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 over inline函數幾乎沒有任何好處。 「更大速度」的想法是一種誤解。使用內聯函數可以獲得相同的速度,但是由於在調用函數之前計算參數,因此您也可以獲得類型安全性,並且不會產生預處理器「粘貼」的副作用(例如,嘗試編寫無處不在的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等.... )
  • Release或Debug(一般記錄,斷言等只包括在調試版本)

他們還可以使用遊戲的開發過程中快速禁用系統的大部分地區, 例如, ,我可能會定義

#define PLAYSOUNDS 

,然後包裝最終呼叫播放聲音:

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

所以它很容易讓我打開和關閉聲音的播放的版本。 (通常我在調試時不會播放聲音,因爲它妨礙了我的個人音樂:)) 好處是您不會通過添加if語句來引入分支....