2009-02-03 81 views
229

在我見過的#如果編譯器指令的所有案例中,他們使用「調試」。我能否以相同的方式使用「RELEASE」來排除在調試模式下編譯時不想運行的代碼?我想用這個塊包圍的代碼發出一堆電子郵件,而且我不想在測試時意外發送這些郵件。#if RELEASE會像#if DEBUG那樣在C#中工作嗎?

+3

'#if!DEBUG`與`#if RELEASE`具有相同的功能。或者,如果在模式中運行不同的代碼,則使用`#if DEBUG`然後使用`#else`然後使用`#endif`。 – Nat 2017-01-14 00:07:11

回答

229

不,不會的,除非你做一些工作。

這裏最重要的部分是什麼DEBUG真的是,它是一種定義的編譯器可以對證不變的。

如果你檢查項目屬性,生成標籤下,你會發現三件事情:

  • 一個文本框標有「條件編譯符號」
  • 複選框標記「定義DEBUG常數」
  • 標記複選框「定義TRACE常數」

沒有這樣的複選框,也不恆定/符號預先定義具有名稱RELEASE。

但是,您可以輕鬆地添加名稱文本框標記條件編譯符號,但要確保你設置的項目配置這樣做之前釋放模式,因爲這些設置是每個配置。

所以基本上,除非你添加到文本框中,#if RELEASE不會將任何配置下產生的任何代碼。


編輯:更正的#ifdef到#IF(感謝丹尼爾)

+6

嘿不是#ifdef C/C++?對於C#,它只是#if – 2009-02-03 16:13:36

332

RELEASE沒有定義,但可以使用

#if (!DEBUG) 
    ... 
#endif 
+2

這不是,但當然你可以使用NOT運算符。當我寫我的答案時沒有想到這一點。 – 2009-02-03 16:03:35

+3

它確實,但使用你的解決方案更清晰,「更正確」,恕我直言。 – 2009-02-03 16:06:10

+0

謝謝你們!我想這個答案就是我會用到的,但我接受了lassevk的答案,因爲它更徹底。 – 2009-02-03 16:10:41

21

在我安裝VS(VS 2008)#如果版本不工作。但是你可以只使用DEBUG

!例如:

#if !DEBUG 
SendTediousEmail() 
#endif 
32

都能跟得上。

儘管在調試配置有定義常數a DEBUG(由Visual Studio自動定義的),而沒有用於釋放模式沒有定義這樣的常數。在構建下檢查您的項目設置。

選擇下的[Define DEBUG constant]項目 - > Build就像在每個文件的開頭包含#define DEBUG一樣。

如果要定義釋放配置的釋放常數,請訪問:

  • 項目屬性 - >生成
  • 選擇釋放模式
  • 條件編譯符號文本框中輸入:RELEASE
-6

爲什麼不只是

#if RELEASE 
#undef DEBUG 
#endif 
8

我從來沒有看到過...但我已經看到了:

#if (DEBUG == FALSE) 

#if (!DEBUG) 

,對於雅工作?

4

「Pop Catalin」說得對。根據構建類型控制定義提供了很大的靈活性。例如,您可以在同一解決方案中擁有「DEBUG」,「DEMO」和「RELEASE」配置。這可以避免使用兩種不同的解決方案重複編程。

所以是的#if RELEASE#if (RELEASE)的作用與RELEASE條件編譯符號定義時的#if DEBUG相同。

從「流行克特林」拍攝後下: 如果要定義爲釋放配置的釋放常數,請訪問: *項目屬性 - >生成 *選擇釋放模式 *在條件編譯符號 textbox輸入:RELEASE

1

我知道這是一個老問題,但值得一提的是,您可以在DEBUG和RELEASE之外創建自己的配置,例如TEST或UAT。

如果然後將項目屬性頁面的生成選項卡上,你然後設置「條件編譯符號」,以測試(例如),那麼你可以使用一個結構,如

#if (DEBUG || TEST) 
    //Code that will not be executed in RELEASE or UAT 
#endif 

您可以使用此結構出於特定的原因,如不同的客戶端,如果你有需要,甚至整個Web方法。我們以前也使用過這種方式,因爲某些命令在特定硬件上導致問題,所以我們在部署到硬件X時爲應用程序配置。

3

您可以爲此使用#if(!DEBUG)。

0

只是一個說明。我非常肯定,當啓用優化版本時,#if DEBUG將從發行版編譯中刪除。

相關問題