<menu id="w8yyk"><menu id="w8yyk"></menu></menu>
  • <dd id="w8yyk"><nav id="w8yyk"></nav></dd>
    <menu id="w8yyk"></menu>
    <menu id="w8yyk"><code id="w8yyk"></code></menu>
    <menu id="w8yyk"></menu>
    <xmp id="w8yyk">
    <xmp id="w8yyk"><nav id="w8yyk"></nav>
  • 網站首頁 > 物聯資訊 > 技術分享

    assert()函數用法總結

    2016-09-28 00:00:00 廣州睿豐德信息科技有限公司 閱讀
    睿豐德科技 專注RFID識別技術和條碼識別技術與管理軟件的集成項目。質量追溯系統、MES系統、金蝶與條碼系統對接、用友與條碼系統對接

    assert宏的原型定義在<assert.h>中,其作用是如果它的條件返回錯誤,則終止程序執行,原型定義:

    #include <assert.h>
    void assert( int expression );

      assert的作用是現計算表達式 expression ,如果其值為假(即為0),那么它先向stderr打印一條出錯信息,然后通過調用 abort 來終止程序運行。請看下面的程序清單badptr.c:

    復制代碼
    #include <stdio.h>
    #include <assert.h>
    #include <stdlib.h>
    int main( void )
    {
    FILE *fp;

    fp = fopen( "test.txt", "w" );//以可寫的方式打開一個文件,如果不存在就創建一個同名文件
    assert( fp ); //所以這里不會出錯
    fclose( fp );

    fp = fopen( "noexitfile.txt", "r" );//以只讀的方式打開一個文件,如果不存在就打開文件失敗
    assert( fp ); //所以這里出錯
    fclose( fp ); //程序永遠都執行不到這里來
    return 0;
    }
    復制代碼

    [root@localhost error_process]# gcc badptr.c 
    [root@localhost error_process]# ./a.out 
    a.out: badptr.c:14: main: Assertion `fp' failed.

      已放棄使用assert()的缺點是,頻繁的調用會極大的影響程序的性能,增加額外的開銷。在調試結束后,可以通過在包含#include <assert.h>的語句之前插入 #define NDEBUG 來禁用assert調用,示例代碼如下:

    #include <stdio.h>
    #define NDEBUG
    #include <assert.h>

     

    用法總結與注意事項:

      1)在函數開始處檢驗傳入參數的合法性如:

    復制代碼
    int resetBufferSize(int nNewSize)
    {
      //功能:改變緩沖區大小,
      //參數:nNewSize 緩沖區新長度
      //返回值:緩沖區當前長度
      //說明:保持原信息內容不變 nNewSize<=0表示清除緩沖區
      assert(nNewSize >= 0);
      assert(nNewSize <= MAX_BUFFER_SIZE);
      ...
    }
    復制代碼

      

      2)每個assert只檢驗一個條件,因為同時檢驗多個條件時,如果斷言失敗,無法直觀的判斷是哪個條件失敗,如:

      不好:

    assert(nOffset>=0 && nOffset+nSize<=m_nInfomationSize);

      好:

    assert(nOffset >= 0);
    assert(nOffset+nSize <= m_nInfomationSize);

      3)不能使用改變環境的語句,因為assert只在DEBUG個生效,如果這么做,會使用程序在真正運行時遇到問題,如:

      錯誤:

    assert(i++ < 100);

      這是因為如果出錯,比如在執行之前i=100,那么這條語句就不會執行,那么i++這條命令就沒有執行。

      正確:

     assert(i < 100);
    i++;

      4)assert和后面的語句應空一行,以形成邏輯和視覺上的一致感。

      5)有的地方,assert不能代替條件過濾。

    RFID管理系統集成商 RFID中間件 條碼系統中間層 物聯網軟件集成
    最近免费观看高清韩国日本大全