2011-08-10 73 views
7

有人可以給我一些如何在c#中使用#define的例子嗎?請定義#define

#define //preprocessor directive 

它的目的是什麼?這裏例如來​​自微軟,我還是不明白:

// preprocessor_if.cs 
#define DEBUG 
#define MYTEST 
using System; 
public class MyClass 
{ 
    static void Main() 
    { 
#if (DEBUG && !MYTEST) 
     Console.WriteLine("DEBUG is defined"); 
#elif (!DEBUG && MYTEST) 
     Console.WriteLine("MYTEST is defined"); 
#elif (DEBUG && MYTEST) 
     Console.WriteLine("DEBUG and MYTEST are defined"); 
#else 
     Console.WriteLine("DEBUG and MYTEST are not defined"); 
#endif 
    } 
} 
+1

小心閱讀http://msdn.microsoft.com/en-us/library/4y6tbswk.aspx – V4Vendetta

+0

#define(在源文件中)不經常使用。相反,它們在編譯時被全局定義(例如通過編譯器開關)以指示環境/平臺/框架等。然後,在需要時使用#if構造執行不同的操作。例如,在完整框架中可用的類在silverlight中不可用,所以您可能需要一個條件導入,具體取決於您是否正在構建silverlight。 –

+0

所以DEBUG這個詞既是關鍵詞又是任意的? – Rod

回答

4

Quote

#定義和#undef線應在源 文本文件的最頂部出現,他們可以調整整個文件的編譯選項。

在C#語言中,#define所在行被認爲是預處理 指令。定義符號有一些無效的語法;例如,您的 不能使用數字值作爲定義的標識符。

的#undef指令確保了在該文件中的文字點之後, 指定的標識符沒有被定義。

在您的示例中,如果定義了DEBUG(只要定義它並不重要),並且未定義MYTEST,則會顯示消息。

否則,如果沒有定義DEBUG但是定義了MYTEST,那麼它將顯示顯示的消息。

如果兩者都已定義,則會顯示顯示的消息。

底線:

的定義要點是選擇適用的編譯選項,你的程序給它一個不同的程序流程。這是來自C和C++的遺留問題。

6

「預處理器」意味着它生成的結果在編譯器執行的主要處理之前完成了之前。它的一個主要用途是在編譯之前包含或排除文件中的代碼。

在你看到的例子中,預處理器將首先#define這兩個符號,然後評估不同#if/#elif語句來找出哪些代碼實際上是在文件中結束。在這種情況下,兩個符號都被定義了,所以只有這樣的行會被輸出,並且只有那些代碼纔會被編譯。如果你要反編譯結果,你只會看到一個Console.WriteLine()聲明,沒有別的。

1

#define是C#中的一個特殊的「編譯前」指令(它來自舊的CPP directives),它定義了一個預處理器符號。

加上#if,根據定義什麼符號,各種代碼將有效註釋掉。因此,非選定路徑中的代碼甚至不需要處於可編譯狀態!

在上面的例子,DEBUGMYTEST在頂部(具有#define)手動定義的符號,因此,代碼「看上去像」時,它開始「正常」的編譯階段如下:(在C#這個預處理編譯器的一部分,而不是在運行第一單獨的工具。)

// preprocessor_if.cs 
//#define DEBUG 
//#define MYTEST 
using System; 
public class MyClass 
{ 
    static void Main() 
    { 
//#if (DEBUG && !MYTEST) 
     //Console.WriteLine("DEBUG is defined"); 
//#elif (!DEBUG && MYTEST) 
     //Console.WriteLine("MYTEST is defined"); 
//#elif (DEBUG && MYTEST) 
     Console.WriteLine("DEBUG and MYTEST are defined"); 
//#else 
     //Console.WriteLine("DEBUG and MYTEST are not defined"); 
//#endif 
    } 
} 

DEBUG符號通常是自動設定,取決於如果該項目正在建造用於調試和其它符號可以被設置爲項目的一部分本身。

快樂編碼。

0

預處理器指令是將在編譯時評估的指令。 #define指令是聲明一個可以在編譯時評估的變量。

#if (DEBUG && !MYTEST) 
     Console.WriteLine("DEBUG is defined"); 
    #endif 

上面的行不會被編譯,因爲DEBUG和MYTEST是在文件開始時定義的。

1

閱讀有關預處理器指令。我編寫C++,所以我沒有像你一樣使用它,但基本上這些是你在語句執行之前定義的東西。通常他們可以使用2種方式。 1.)在第一個函數運行之前定義一些東西,也就是說,可以在將pie作爲主函數中的一個變量進行調用之前定義pie的數值。 2.)告訴程序要加載什麼才能正確執行程序。

相關問題