判斷提示
更新:2007 年 11 月
這個主題適用於:
版本 |
Visual Basic |
C# |
C++ |
Web Developer |
---|---|---|---|---|
Express 版 |
僅適用原生 |
|||
Standard 版 |
僅適用原生 |
|||
Pro/Team 版 |
僅適用原生 |
表格圖例:
套用 |
|
不套用 |
|
預設隱藏的命令。 |
判斷提示 (Assertion) 陳述式會指定您希望在程式的某個特定點維持為 true 的條件。如果該條件並未維持 True,表示判斷提示失敗,程式執行將會中斷,並出現判斷提示已失敗對話方塊。
Visual C++ 根據下列建構支援判斷提示陳述式:
您可以使用下列判斷提示:
MFC 和 C 執行階段程式庫判斷提示
當偵錯工具因為 MFC 或 C 執行階段程式庫判斷提示而中止時,它會巡覽到原始程式檔裡發生判斷提示的地方 (如果有原始碼)。判斷提示訊息會出現在輸出視窗以及 [判斷提示已失敗] 對話方塊裡。如果您要儲存判斷提示訊息以供未來參考,您可以從 [輸出] 視窗複製這段內容至文字視窗。[輸出] 視窗也可能包含其他的錯誤訊息。請仔細地檢查這些訊息,因為它們提供了造成判斷提示失敗的線索。
您可以透過在程式碼裡自由地使用判斷提示,捕捉許多開發期間的錯誤。為您所做的每個假設撰寫判斷提示是良好的規則。例如,您假設了某個引數不是 NULL,便可使用判斷提示陳述式來檢查這個假設。
_DEBUG
判斷提示陳述式只有在定義了 _DEBUG 時才會編譯。當 _DEBUG 尚未定義時,編譯器會將判斷提示當成 Null 陳述式。因此,判斷提示陳述式不會造成最終發行程式任何負荷量;您可以在不會影響發行版本 (Release Version) 的效能,且無需使用 #ifdef 指示詞的情況下,自由地在程式碼裡使用它們。
使用判斷提示的副作用
在程式碼加入判斷提示時,請確定判斷提示不會有副作用。例如,請考慮下列判斷提示:
ASSERT(nM++ > 0); // Don't do this!
因為 ASSERT 運算式不會在程式的發行版本裡評估,所以 nM 在偵錯版本和發行版本中會有不同的值。在 MFC 裡,您可以使用 VERIFY 巨集取代 ASSERT。VERIFY 會評估運算式,但不會檢查發行版本的結果。
請特別小心在判斷提示陳述式裡使用函式呼叫 (Function Call),因為評估函式可能會有意料之外的影響。
ASSERT ( myFnctn(0)==1 ) // unsafe if myFnctn has side effects
VERIFY ( myFnctn(0)==1 ) // safe
VERIFY 在偵錯版本和發行版本都會呼叫 myFnctn,因此可以放心使用。然而,發行版本中仍然會產生不必要函式呼叫的負荷量。