回答
用於停用斷言模塊範圍內我會使用:
#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) {}
。
與枚舉的好主意。謝謝。 – 2009-09-19 17:22:11
要爲C++文件中禁用斷言,您可以執行下列操作之一:
- 定義附近的源文件的頂部
NDEBUG
不變。 - 將
-DNDEBUG
添加到源文件的編譯選項。
大多數IDE和/或構建基礎結構允許您指定每個文件的構建選項,因此這是一個簡單的解決方案。
當多個類混合到同一個源文件中,或者在頭文件中有許多內聯函數時,關閉每個類的斷言更加困難。你當然可以在相關的地方#define NDEBUG
和#undef NDEBUG
。
由於一些IDE希望能夠爲非調試版本設置NDEBUG
,您可以通過選擇自己的宏名稱(例如DISABLE_ASSERT
)使其更具可擴展性。然後在通用頭文件(未預編譯)中包含類似以下代碼:
#ifdef DISABLE_ASSERT
#define NDEBUG
#endif
'#define NDEBUG'除了禁用斷言之外還可能有其他不良的副作用。 – 2009-09-19 16:20:42
有什麼副作用? – 2009-09-19 17:20:58
禁用其他調試宏/代碼,不僅聲明。 – 2009-09-19 17:24:44
要斷言的代碼考慮良好的編碼風格。
至於運行時間打開/關閉您可以用布爾變量來做到這一點。例如,在您的代碼中,您可以執行以下操作:
定義一個變量,用於指示斷言在全局命名空間中是打開還是關閉(例如,在同一個文件中的main()函數外) 。
bool turnOnAssertions;
定義爲下面寫在其他文件中要開啓/關閉你的斷言一個變量:
extern bool turnOnAssertions;
因此,通過與UI操縱turnOnAssertions變量和寫作
if(turnOnAssertions)
assert(…);
你可以打開/關閉你的一些斷言!
至於編譯時,你應該做到以下幾點:
爲您編譯器,你應該給像-DASSERTIONSON標誌(-Dflag_name [標記名稱,你可以設置你想要的任何東西])
#ifdef ASSERTIONSON
bool turnOnAssertions = true;
#else
bool turnOnAssertions = false;
#endif
並只使用該變量。
祝你好運!
- 1. 通知檢查策略
- 2. 黑莓IT策略檢查
- 3. AssertJ - 繼續用流利的斷言檢查
- 4. WSP0075:策略斷言「TransportBinding」被評估爲「UNKNOWN」。爲什麼?
- 5. 根據Active Directory策略檢查密碼
- 6. 跨域策略iFrame - 檢查元素?
- 7. MINITEST斷言失敗的檢查
- 8. 證明命題重言式的策略?
- 9. 診斷Java內存問題的策略
- 10. 流利斷言:斷言一個或另一個值
- 11. MSTest有流利的斷言API嗎?
- 12. 如果使用流利的斷言
- 13. 查找Heisenbugs的策略
- 14. 設備策略管理員無法檢索設備策略
- 15. PHP問卷調查策略
- 16. 查詢加速策略
- 17. 策略查詢執行
- 18. 檢索當前用戶的策略
- 19. 檢查是否應用相同的來源策略
- 20. 從mysqli服務器策略檢查按鈕的Android幫助
- 21. 檢查evars的策略,返回一個值
- 22. 如何檢查System.Runtime.Caching.ObjectCache內的緩存策略?
- 23. 檢查設備上執行的設備管理策略
- 24. 在Red Had Linux上檢查硬盤問題的最佳策略
- 25. 在varbinary字段上檢查ISNULL的策略?
- 26. WP7政策檢查
- 27. 策略
- 28. 從rspec中斷言斷言與斷言
- 29. Symfony:斷言/長度忽略空白
- 30. 摩卡柴斷言貌似忽略
在編譯時或運行時打開/關閉? – 2009-09-19 14:05:28
好點。在編譯時。 – 2009-09-19 14:16:32