2009-09-19 50 views
1

有些斷言代價高昂,有些斷言在生產代碼中更好。 至少不清楚應該始終啓用斷言。斷言檢查的便利策略

在我的應用程序中,我希望能夠打開/關閉每個文件或每個類的部分斷言。

如何在C++中執行此操作?

+0

在編譯時或運行時打開/關閉? – 2009-09-19 14:05:28

+0

好點。在編譯時。 – 2009-09-19 14:16:32

回答

2

用於停用斷言模塊範圍內我會使用:

#if defined(assert) 
# undef assert 
# define assert(x) ((void)0) 
#endif 

...當然,如果你是好與使用自定義宏這樣可以簡化。

#if defined(_NO_ASSERTS) 
# define myAssert(x) ((void)0) 
#else 
# define myAssert(x) assert(x) 
#endif 

對於類範圍內的失活我會使用一個靜態常量類成員或類範圍的枚舉結合自定義宏:

#define myAssert(x) do { if(_CLASS_ASSERT) { assert(x); } } while(0) 

class AssertOff 
{ 
    enum { _CLASS_ASSERT = 0 } 
} 

隨着枚舉和靜態常量的bool所有現代編譯應該優化掉if(_CLASS_ASSERT) {}

+0

與枚舉的好主意。謝謝。 – 2009-09-19 17:22:11

0

要爲C++文件中禁用斷言,您可以執行下列操作之一:

  • 定義附近的源文件的頂部NDEBUG不變。
  • -DNDEBUG添加到源文件的編譯選項。

大多數IDE和/或構建基礎結構允許您指定每個文件的構建選項,因此這是一個簡單的解決方案。

當多個類混合到同一個源文件中,或者在頭文件中有許多內聯函數時,關閉每個類的斷言更加困難。你當然可以在相關的地方#define NDEBUG#undef NDEBUG

由於一些IDE希望能夠爲非調試版本設置NDEBUG,您可以通過選擇自己的宏名稱(例如DISABLE_ASSERT)使其更具可擴展性。然後在通用頭文件(未預編譯)中包含類似以下代碼:

#ifdef DISABLE_ASSERT 
#define NDEBUG 
#endif 
+1

'#define NDEBUG'除了禁用斷言之外還可能有其他不良的副作用。 – 2009-09-19 16:20:42

+0

有什麼副作用? – 2009-09-19 17:20:58

+0

禁用其他調試宏/代碼,不僅聲明。 – 2009-09-19 17:24:44

1

要斷言的代碼考慮良好的編碼風格。

至於運行時間打開/關閉您可以用布爾變量來做到這一點。例如,在您的代碼中,您可以執行以下操作:

定義一個變量,用於指示斷言在全局命名空間中是打開還是關閉(例如,在同一個文件中的main()函數外) 。

bool turnOnAssertions; 

定義爲下面寫在其他文件中要開啓/關閉你的斷言一個變量:

extern bool turnOnAssertions; 

因此,通過與UI操縱turnOnAssertions變量和寫作

if(turnOnAssertions) 
assert(…); 

你可以打開/關閉你的一些斷言!

至於編譯時,你應該做到以下幾點:

爲您編譯器,你應該給像-DASSERTIONSON標誌(-Dflag_name [標記名稱,你可以設置你想要的任何東西])

#ifdef ASSERTIONSON 
bool turnOnAssertions = true; 
#else 
bool turnOnAssertions = false; 
#endif 

並只使用該變量。

祝你好運!