2016-04-21 107 views
1

我努力學習預處理指令,所以我做了一個簡單的例子是這樣的:預處理指令不可能定義或取消定義預處理

using System; 

namespace learning 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
#define DEBUG 
      test(); 
     } 

     private void test() 
     { 
#if DEBUG 
      Console.WriteLine("Debug mode"); 
#elif RELEASE 
      Console.WriteLine("Release mode"); 
#else 
      Console.WriteLine("Debug and release don't defined"); 
#endif 
     } 

    } 
} 

,但我遺憾的是這個錯誤:

Impossible to define or cancel defining the preprocessor symbols after the first token in the file

我從一本編程書籍中拿這個例子,有什麼不對?

更新(我的溶液):

#define RELEASE 
using System; 

namespace learning 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
#if DEBUG 
      Console.WriteLine("Debug mode"); 
#elif RELEASE 
      Console.WriteLine("Release mode"); 
#else 
      Console.WriteLine("Debug and release don't defined"); 
#endif 
      Console.ReadLine(); 
     } 

    } 
} 

打印結果:Debug mode,但應該是Release mode。我做錯了什麼?

+1

將#define DEBUG放在文件的開頭。 – neo

+0

這本書是錯誤的,基本上。它是哪本書?名字和恥辱...(我真的希望它不是我的...) –

+0

@JonSkeet http://antoniopelleriti.it/page/libro-csharp – Dillinger

回答

4

作爲新之前提到的,你可以在你的文件的頂部定義它。或者,如果你希望它是全局的,並且你正在使用Visual Studio,你可以在你的項目屬性中定義它(右鍵單擊項目,選擇Properties,然後進入Build選項卡)。

該屏幕將允許您根據構建配置定義符號(因此您可以爲調試構建設置符號並在切換配置時自動刪除它)。

如果您不使用Visual Studio,則可以將條件符號傳遞給MSBuild或csc(命令行編譯或命令行c#編譯器)。所有這些選項都可以讓您在不更改源代碼的情況下設置/取消設置符號。

+0

明白了,但可以定義更多的符號? – Dillinger

+0

@Dillinger:您可以在每個文件的開頭以及項目設置中定義任意數量的符號。進入「普通」代碼後,您無法定義更多符號。 –

+0

是的,你可以根據需要定義多個 - 只需將它們放入Build選項卡中的「Conditional Compilation symbols」中。 – JMarsch

2

你需要把#define線在文件的最開始,using陳述

+0

哦,這本書沒有任何反駁。我現在明白了。但是我已經更新了'#define RELEASE'的例子,爲什麼編譯器會打印我:'Debug mode'而不是'Release mode'? – Dillinger

+0

@Dillinger:我的猜測是你在Visual Studio中以調試配置構建它,其中DEBUG已經在項目設置中定義。 –

+0

查看下面的答案,但除了調試符號之外,還可以構建配置。這允許您設置一組選項,並讓它們適用於特定的配置。例如,默認情況下,您在創建項目時將獲得「調試」和「發佈」配置。調試啓用了DEBUG符號,並關閉了編譯器優化。發佈打開編譯優化(還有其他差異)。查看配置管理器(右鍵單擊解決方案)。 – JMarsch