欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C/C++ assert()函數(shù)用法案例總結(jié)

 更新時(shí)間:2021年09月09日 15:44:51   作者:白菜菜白  
這篇文章主要介紹了C/C++ assert()函數(shù)用法案例總結(jié),本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下

1. 簡(jiǎn)介

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

原型定義:

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

 assert的作用是先計(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" );//以可寫的方式打開(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ào)用會(huì)極大的影響程序的性能,增加額外的開(kāi)銷。在調(diào)試結(jié)束后,可以通過(guò)在包含#include <assert.h>的語(yǔ)句之前插入 #define NDEBUG 來(lái)禁用assert調(diào)用,示例代碼如下:

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

2. 用法總結(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ò)濾。

    assert是用來(lái)避免顯而易見(jiàn)的錯(cuò)誤的,而不是處理異常的。錯(cuò)誤和異常是不一樣的,錯(cuò)誤是不應(yīng)該出現(xiàn)的,異常是不可避免的。c語(yǔ)言異??梢酝ㄟ^(guò)條件判斷來(lái)處理,其它語(yǔ)言有各自的異常處理機(jī)制。

    一個(gè)非常簡(jiǎn)單的使用assert的規(guī)律就是,在方法或者函數(shù)的最開(kāi)始使用,如果在方法的中間使用則需要慎重考慮是否是應(yīng)該的。方法的最開(kāi)始還沒(méi)開(kāi)始一個(gè)功能過(guò)程,在一個(gè)功能過(guò)程執(zhí)行中出現(xiàn)的問(wèn)題幾乎都是異常。

到此這篇關(guān)于C/C++ assert()函數(shù)用法案例總結(jié)的文章就介紹到這了,更多相關(guān)C/C++ assert()函數(shù)用法內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C++寫時(shí)拷貝實(shí)現(xiàn)原理及實(shí)例解析

    C++寫時(shí)拷貝實(shí)現(xiàn)原理及實(shí)例解析

    這篇文章主要介紹了C++寫時(shí)拷貝實(shí)現(xiàn)原理及實(shí)例解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-06-06
  • C語(yǔ)言歸排與計(jì)排深度理解

    C語(yǔ)言歸排與計(jì)排深度理解

    這篇文章主要為大家詳細(xì)的介紹了C語(yǔ)言中計(jì)數(shù)排序和歸并排序,歸并排序是創(chuàng)建在歸并操作上的一種有效的排序算法,計(jì)數(shù)排序不用比較兩個(gè)數(shù)的大小,感興趣的朋友可以參考閱讀
    2023-04-04
  • C++11 thread多線程編程創(chuàng)建方式

    C++11 thread多線程編程創(chuàng)建方式

    這篇文章主要介紹了C++11 thread多線程編程的相關(guān)知識(shí),包括線程的創(chuàng)建方式結(jié)束方式及互斥鎖的實(shí)例代碼詳解,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-12-12
  • C語(yǔ)言樹(shù)與二叉樹(shù)基礎(chǔ)全刨析

    C語(yǔ)言樹(shù)與二叉樹(shù)基礎(chǔ)全刨析

    二叉樹(shù)可以簡(jiǎn)單理解為對(duì)于一個(gè)節(jié)點(diǎn)來(lái)說(shuō),最多擁有一個(gè)上級(jí)節(jié)點(diǎn),同時(shí)最多具備左右兩個(gè)下級(jí)節(jié)點(diǎn)的數(shù)據(jù)結(jié)構(gòu)。本文將詳細(xì)介紹一下C中二叉樹(shù)與樹(shù)的概念和結(jié)構(gòu),需要的可以參考一下
    2022-04-04
  • C++ 詳細(xì)講解對(duì)象的構(gòu)造順序

    C++ 詳細(xì)講解對(duì)象的構(gòu)造順序

    對(duì)象的構(gòu)造往往和構(gòu)造函數(shù)會(huì)牽扯在一起,構(gòu)造函數(shù)的函數(shù)可能會(huì)由非常復(fù)雜的邏輯所組成,不同類的構(gòu)造函數(shù)的程序邏輯很可能是相互依賴的,當(dāng)這種相互依賴一旦成立,那么對(duì)象的構(gòu)造順序很可能導(dǎo)致難以調(diào)試的Bug出現(xiàn)
    2022-04-04
  • c++動(dòng)態(tài)內(nèi)存管理與智能指針的相關(guān)知識(shí)點(diǎn)

    c++動(dòng)態(tài)內(nèi)存管理與智能指針的相關(guān)知識(shí)點(diǎn)

    為了更容易同時(shí)也更安全地使用動(dòng)態(tài)內(nèi)存,新的標(biāo)準(zhǔn)庫(kù)提供了兩種智能指針(smart pointer)類型來(lái)管理對(duì)象,下面這篇文章主要給大家介紹了關(guān)于c++動(dòng)態(tài)內(nèi)存管理與智能指針的相關(guān)知識(shí)點(diǎn),需要的朋友可以參考下
    2022-03-03
  • C++實(shí)現(xiàn)LeetCode(27.移除元素)

    C++實(shí)現(xiàn)LeetCode(27.移除元素)

    這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode(27.移除元素),本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-07-07
  • C語(yǔ)言實(shí)現(xiàn)BST二叉排序樹(shù)的基本操作

    C語(yǔ)言實(shí)現(xiàn)BST二叉排序樹(shù)的基本操作

    這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)BST二叉排序樹(shù)的基本操作,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-09-09
  • C++編譯報(bào)錯(cuò):||error: ld returned 1 exit status|的解決

    C++編譯報(bào)錯(cuò):||error: ld returned 1 exit 

    這篇文章主要介紹了C++編譯報(bào)錯(cuò):||error: ld returned 1 exit status|的解決方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-01-01
  • C語(yǔ)言修煉之路初識(shí)分支句?循環(huán)助本心上篇

    C語(yǔ)言修煉之路初識(shí)分支句?循環(huán)助本心上篇

    現(xiàn)實(shí)生活中我們經(jīng)常需要根據(jù)不同的條件做出不同的選擇。程序設(shè)計(jì)中也需要根據(jù)條件來(lái)選擇不同的程序進(jìn)行處理,這稱之為分支結(jié)構(gòu),當(dāng)條件表達(dá)式不存在時(shí),它被假設(shè)為真。您也可以設(shè)置一個(gè)初始值和增量表達(dá)式,一般情況下,C?程序員偏向于使用?for(;;)?結(jié)構(gòu)來(lái)表示一個(gè)無(wú)限循環(huán)
    2022-03-03

最新評(píng)論