最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

淺析C語(yǔ)言中assert的用法

 更新時(shí)間:2021年10月25日 11:11:47   投稿:jingxian  
以下是對(duì)C語(yǔ)言中assert的使用方法進(jìn)行了介紹,需要的朋友可以參考下

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

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

assert的作用是現(xiàn)計(jì)算表達(dá)式 expression ,如果其值為假(即為0),那么它先向stderr打印一條出錯(cuò)信息,
然后通過(guò)調(diào)用 abort 來(lái)終止程序運(yùn)行。

請(qǐng)看下面的程序清單badptr.c:

#include <stdio.h>
#include <assert.h>
#include <stdlib.h>
int main( void )
{
       FILE *fp;
    
       fp = fopen( "test.txt", "w" );//以可寫(xiě)的方式打開(kāi)一個(gè)文件,如果不存在就創(chuàng)建一個(gè)同名文件
       assert( fp );                           //所以這里不會(huì)出錯(cuò)
       fclose( fp );
    
       fp = fopen( "noexitfile.txt", "r" );//以只讀的方式打開(kāi)一個(gè)文件,如果不存在就打開(kāi)文件失敗
       assert( fp );                           //所以這里出錯(cuò)
       fclose( fp );                           //程序永遠(yuǎn)都執(zhí)行不到這里來(lái)
       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的缺點(diǎn)是,頻繁的調(diào)用會(huì)極大的影響程序的性能,增加額外的開(kāi)銷(xiāo)。
在調(diào)試結(jié)束后,可以通過(guò)在包含#include <assert.h>的語(yǔ)句之前插入 #define NDEBUG 來(lái)禁用assert調(diào)用,示例代碼如下:

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

宏名: assert

功 能: 測(cè)試一個(gè)條件并可能使程序終止
用 法: void assert(int test);

程序例:

#include <assert.h>
#include <stdio.h>
#include <stdlib.h>
struct ITEM {
  int key;
  int value;
};
 
/* add item to list, make sure list is not null */
void additem(struct ITEM *itemptr) {
  assert(itemptr != NULL);
  /* add item to list */
}
 
int main(void)
{
  additem(NULL);
  return 0;
}

assert() 宏用法

注意:assert是宏,而不是函數(shù)。在C的assert.h頭文件中。

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

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

assert的作用是先計(jì)算表達(dá)式expression,如果其值為假(即為0),那么它先向標(biāo)準(zhǔn)錯(cuò)誤流stderr打印一條出錯(cuò)信息,然后通過(guò)調(diào)用abort來(lái)終止程序運(yùn)行;否則,assert()無(wú)任何作用。宏assert()一般用于確認(rèn)程序的正常操作,其中表達(dá)式構(gòu)造無(wú)錯(cuò)時(shí)才為真值。完成調(diào)試后,不必從源代碼中刪除assert()語(yǔ)句,因?yàn)楹闚DEBUG有定義時(shí),宏assert()的定義為空。

用法總結(jié)與注意事項(xiàng):

1)在函數(shù)開(kāi)始處檢驗(yàn)傳入?yún)?shù)的合法性
如:

int resetBufferSize(int nNewSize)
{
//功能:改變緩沖區(qū)大小,
//參數(shù):nNewSize 緩沖區(qū)新長(zhǎng)度
//返回值:緩沖區(qū)當(dāng)前長(zhǎng)度 
//說(shuō)明:保持原信息內(nèi)容不變 nNewSize<=0表示清除緩沖區(qū)
assert(nNewSize >= 0);
assert(nNewSize <= MAX_BUFFER_SIZE);

...
}

2)每個(gè)assert只檢驗(yàn)一個(gè)條件,因?yàn)橥瑫r(shí)檢驗(yàn)多個(gè)條件時(shí),如果斷言失敗,無(wú)法直觀的判斷是哪個(gè)條件失敗

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

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

3)不能使用改變環(huán)境的語(yǔ)句,因?yàn)閍ssert只在DEBUG個(gè)生效,如果這么做,會(huì)使用程序在真正運(yùn)行時(shí)遇到問(wèn)題
錯(cuò)誤: assert(i++ < 100)
這是因?yàn)槿绻鲥e(cuò),比如在執(zhí)行之前i=100,那么這條語(yǔ)句就不會(huì)執(zhí)行,那么i++這條命令就沒(méi)有執(zhí)行。
正確: assert(i < 100)
i++;
4)assert和后面的語(yǔ)句應(yīng)空一行,以形成邏輯和視覺(jué)上的一致感

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

相關(guān)文章

  • C/C++字節(jié)序的深入理解

    C/C++字節(jié)序的深入理解

    本文主要介紹了C/C++字節(jié)序的深入理解,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-02-02
  • 最新評(píng)論

    内江市| 岫岩| 乌恰县| 财经| 长兴县| 武陟县| 尉氏县| 闻喜县| 册亨县| 榕江县| 称多县| 临安市| 黑河市| 河间市| 吴江市| 双江| 永胜县| 吉林省| 莱州市| 诏安县| 巩留县| 峡江县| 榆林市| 南和县| 鄂伦春自治旗| 湟中县| 页游| 招远市| 彭泽县| 永川市| 共和县| 都昌县| 呼和浩特市| 同心县| 谢通门县| 拜泉县| 磴口县| 富阳市| 台山市| 家居| 体育|