注意:assert在release版本中仍可生效

assert在程序的release版本中仍然有效(不要與VC中的ASSERT混淆),要使assert失效,只有在包含assert頭文件(assert.h)的語句前定義NDEBUG宏或在編譯器參數中添加-DNDEBUG參數。

********************************************************相關文章轉載**********************************************

#來自http://community.csdn.net/Expert/topic/4342/4342874.xml?temp=.2288935

當構造一個應用程序的時候,應該始終記住:應該讓程序在出現bug或非預期的錯誤的時候,應該讓程序儘可能早地突然死亡。這樣做可以幫助你在開發——測試循環中儘早地發現錯誤。不導致突然死亡的錯誤將很難被發現;它們通常會被忽略,直到程序在客戶系統中運行以後才被注意到。
    檢查非預期狀態的最簡單的方式是通過標準C庫的assert宏。這個宏的參數是一個布爾表達式(Boolean expression)。當表達式的值爲假的時候,assert會輸出源文件名、出錯行數和表達式的字面內容,然後導致程序退出。Assert宏可用於大量程序內部需要一致性檢查的場合。例如,可以用assert檢查程序參數的合法性、檢查函數(或C++中的類方法)的前提條件和最終狀態(postcondition)、檢查非預期的函數返回值,等等。
    每次使用assert宏,不僅可以作爲一項運行期的檢查,還可以被當作是嵌入代碼中的文檔,用於指明程序的行爲。如果你的程序中包含了assert( condition ),它就是在告訴閱讀代碼的人:condition在這裏應該始終成立;否則很可能是程序中的bug。
    對於效率至上的代碼,assert這樣的運行時檢查可能引入嚴重的效率損失。在這種情況下,你可以定義NDEBUG宏並重新編譯源碼(可以通過在編譯器參數中添加 –DNDEBUG參數做到)。在這種情況下,assert宏的內容將被預處理器清除掉。應該只在當效率必須優先考慮的情況下,對包含效率至上的代碼的文件設置NDEBUG宏進行編譯。
    因爲assert可能被預處理過程清除,當使用這個宏的時候必須確信條件表達式不存在副作用。特別的,不應該在assert的條件表達式中使用這些語句:函數調用、對變量賦值、使用修改變量的操作符(如 ++ 等)。

    例如,假設你在一個循環中重複調用函數do_something。這個函數在成功的情況下返回0,失敗則返回非0值。但是你完全不期望它在程序中出現失敗的情況。你可能會想這樣寫:
for (i = 0; i < 100; ++i)
  assert (do_something () == 0);

    不過,你可能發現這個運行時檢查引入了不可承受的性能損失,並因此決定稍候指定NDEBUG以禁用運行時檢測。這樣做的結果是整個對assert的調用會被完全刪除,也就是說,assert宏的條件表達式將永遠不會被執行,do_something一次也不會被調用。因此,這樣寫纔是正確的:
for (i = 0; i < 100; ++i) {
  int status = do_something ();
  assert (status == 0);
}

    另外一個需要記住的是,不應該使用assert去檢測不合法的用戶輸入。用戶即使在輸入不合適的信息後也不希望看到程序僅在輸出一些含義模糊的錯誤信息後崩潰。你應該檢查用戶的非法輸入並向用戶返回可以理解的錯誤信息。只當進行程序內部的運行時檢查時才應使用assert宏。
    一些建議使用assert宏的地方:
    &#8226; 檢查函數參數的合法性,例如判斷是否爲NULL指針。由 { assert (pointer != NULL)} 得到的錯誤輸出
    Assertion ‘pointer != ((void *)0)’ failed.
    與當程序因對NULL指針解引用得到的錯誤信息
    Segmentation fault (core dumped)
    相比而言要清晰得多。

    &#8226; 檢查函數參數的值。例如,當一個函數的foo參數必須爲正數的時候我們可以在函數開始處進行這樣的檢查:
    assert (foo > 0);
    這會幫助你發現錯誤的調用;同時它很清楚地告訴了讀代碼的人:這個函數對參數的值有特殊的要求。

    不要就此退縮;在你的程序中適當地時候使用assert宏吧。

www.AdvancedLinuxProgramming.com
英文版版權歸原作者
完美廢人 翻譯

*****************************************************************************************************************

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章