2014-12-05 56 views
1

我有一個習慣,使用這樣的代碼調試不是很瑣碎寫塊:臨時禁用調試代碼

if(0) 
{ 
    // debugging code 
} 

問題是"warning C4127: conditional expression is constant"

我對未來隨時可以刪除的舊代碼保留註釋(但應該保留一段時間纔能有可能遵循原作者的意圖)。我可以使用「#if 0」,但我沒有看到任何可讀性的提高,相反(但這可能是一個口味問題)。

哪個更友好,更具可讀性,免警告解決方案?

(因爲這更多的是關於風格的問題,也許是一個更好的StackExchange的地方)

編輯調試代碼並不等同於調試配置(_DEBUG):通常是內_DEBUG,但我不想污染它,所以我有禁用它if (0)

回答

5

使用預處理器:

#if 0 
    // Deactivated code. 
#endif 

您也可以定義一個宏DEBUG(或您選擇的名稱),然後像做

#ifdef DEBUG 
    // Debug code. 
#endif 

注:我建議使用自己的宏來代替現有的(如_DEBUG或NDEBUG看到_DEBUG vs NDEBUG)。

+1

除了避免編譯器警告,通過預處理器排除條件代碼加快了編譯速度,因爲編譯器根本沒有看到禁用的代碼。而且你不依賴於優化器來發現它可以被消除,所以即使在未優化的版本中,你也可能會得到更小的可執行文件。 – Wyzard 2014-12-05 15:11:19

+1

@Wyzard與可讀性相比,這種優化不算什麼。 – Liviu 2014-12-05 15:17:49

+1

我不認爲'#if 0'比'if(0)'更不可讀。 – Wyzard 2014-12-05 15:18:37

1

我喜歡這樣做:

bool test = false; 
if (test) 
{ 
    ... 
} 

這有額外的好處,我可以在if語句設置斷點和應用程序運行時啓用或禁用調試代碼更改測試值。

+0

副作用是添加另一個變量(另一種污染)。另外,我發現它不太可讀 - 假設你忘記'真',稍後有人可能認爲代碼是必需的(對於錯誤日誌,例如),而if(1)'/ if(0) '不那麼容易混淆。 – Liviu 2014-12-05 15:16:23

3

你可以用逗號(http://en.wikipedia.org/wiki/Comma_operator):

if (0,0) { 
    // ... 
} 

下VS2013在我的代碼刪除我這個警告,在最高級別的警告

[編輯]

我有時用以下成語:

#if defined(_DEBUG) 
    static bool bVerbose = false; 
    if (bVerbose) { 
     // do some debugging code, like print to log some data structure etc. 
    } 
#endif 

然後當我step thr ough代碼和我需要更多調查的地方我將調試器中的bVerbose更改爲true,並且我可以看到它的輸出等。這樣我就不必重新編譯項目以啓用調試代碼,並且還嘗試重現問題。此處更改執行點也非常有用。

0

拿這個!定義和調用一個函數LAMDA

缺點:

  • C++ 11只

  • 恆定的,但是編譯器不得到它(至少G ++)
  • 一個班輪
  • 其他範圍沒有狀態
  • 直觀易記;)

測試代碼

#include <iostream> 

#define ON ([]() { return true; }()) 
#define OFF ([]() { return false; }()) 

int main() 
{ 
    if (ON) 
    { 
     std::cout << "Block 1" << std::endl; 
    } 

    if (OFF) 
    { 
     std::cout << "Block 2" << std::endl; 
    } 

    return 0; 
} 

編輯:什麼意味作爲擺在首位開個玩笑使用正確的宏可能是相當方便的。往上看。