1. 程式人生 > >三十四 assert()函式用法總結

三十四 assert()函式用法總結

 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;
}

[[email protected] error_process]# gcc badptr.c 
[[email protected] 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(intnNewSize)
{  //功能:改變緩衝區大小,//引數: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++;

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

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

相關推薦

assert()函式用法總結

 assert巨集的原型定義在<assert.h>中,其作用是如果它的條件返回錯誤,則終止程式執行,原型定義: #include <assert.h>void assert( int expression );   assert的作用是現計算表示式 

C/C++ assert()函式用法總結

轉自:https://www.cnblogs.com/lvchaoshun/p/7816288.html   assert巨集的原型定義在<assert.h>中,其作用是如果它的條件返回錯誤,則終止程式執行。 原型定義: #include <assert.

assert()函式用法總結

assert巨集的原型定義在<assert.h>中,其作用是如果它的條件返回錯誤,則終止程式執行,原型定義: #include <assert.h> void assert( int expression );  assert的作用是現計算表示式

C語言:assert()函式用法總結

  assert巨集的原型定義在<assert.h>中,其作用是如果它的條件返回錯誤,則終止程式執行,原型定義: #include <assert.h>void assert( int expression );   assert的作用是現計算表示式 expression ,如果

馬哥教育第一天至天學習總結

內核編譯、系統開機、系統進程管理、AWK馬哥M28三十一天、 進程管理和啟動流程、 CentOS6及其之前的操作系統根進程是/sbin/init , centos5及其之前使用的安裝管理工具是SysV ,CentOS6是upstart , CentOS7是systemd 單用戶方式啟動:修改root密碼或者

Linux學習總結)lamp之用戶認證和域名跳轉

lamp 用戶認證 域名跳轉 訪問日誌 用戶認證 為了某些網站的安全需要,特意授權特定用戶訪問,因此產生了網站訪問的用戶認證機制。我們可以針對某個站點進行認證,也可以指定某個目錄,或者是一個文件。編輯虛擬主機配置文件:vim /usr/local/apache2.4/conf/extra/ht

python學習天函數高階函數定義及用法

文章 返回 定義 com bsp n) cti UNC 結果 python函數高階函數是把函數當成一個變量,傳遞給函數作為參數,或者函數的返回值裏面有函數,都稱為高階函數, 1,把函數作為參數傳遞 def dac(x,y):   return x+y

、ES6中箭頭函式的使用

1、單引數箭頭函式 ES6中允許使用“箭頭”(=>)定義函式: var f = v => v; 以上程式碼相當於: var f = function( v ) { return v; } “箭頭”(=>)後面是函式體,“箭頭”(=>

、Linux 程序與訊號——訊號特點、訊號集和訊號遮蔽函式

34.1 訊號特點 訊號的發生是隨機的,但訊號在何種條件下發生是可預測的 程序槓開始啟動時,所有訊號的處理方式要麼預設,要麼忽略;忽略是 SIGUSR1 和 SIGUSR2 兩個訊號,其他都採取預設方式(大多數是終止程序)。 程序在呼叫 exec 函式後,原有訊號的捕捉函式失效 子程序的誕

python介面自動化()-封裝與呼叫--函式和引數化(詳解)

簡介   前面雖然實現了引數的關聯,但是那種只是記流水賬的完成功能,不便於維護,也沒什麼可讀性,隨著水平和技能的提升,再返回頭去看前邊寫的程式碼,簡直是慘不忍睹那樣的程式碼是初級入門的程式碼水平都達不到。接下來這篇由我帶領小夥伴們把每一 個滑鼠點選動作寫成一個函式,這樣更方便維護了,而且可讀性也高,後期其

構建之法、五章總結

創業 安排 便是 為什麽 軟件 構建 似的 讓我 生活 趁著五一小短假期間閱讀了這三章,讓我感覺想要成為一名軟件工程師的路還要很長,在我面前就出現了一條分叉路:即是成為一名個人能力優異但不顧及團隊成員理解與否的程序員還是個人能力一般但會結合團隊人員的理解能力去編程的程序員,

一起talk C栗子吧(第回:C語言實例--巧用溢出計算最值)

gcc 空間 代碼 讓我 計算 max value 其他 存儲 點擊 各位看官們。大家好,上一回中咱們說的是巧用移位的樣例,這一回咱們說的樣例是:巧用溢出計算最值。 閑話休提,言歸正轉。讓我們一起talk C栗子吧! 大家都知

Android筆記.Service綜合實例二

com err out 生成 lds fcm con .so ron 綜合實例2:client訪問遠程Service服務 實現:通過一個button來獲取遠程Service的狀態,並顯示在兩個文本框中。 思路:如果A應用須要與B應用進行通信,調用B應用中

走入計算機的第天(基於tcp和udp的套接字)

recv 設置 內存 tcp list dup lis 不知道 狀態 一 TCP套接字 1 low版TCP套接字 服務器端                              客戶端        2、改進版tcp套接字           服務端   

javaweb()——使用JDBC處理MySQL大數據

solid 項目 class tez writer manager drive lvf lzo 一、基本概念   大數據也稱之為LOB(Large Objects),LOB又分為:clob和blob,clob用於存儲大文本,blob用於存儲二進制數據,例如圖像、聲音、二進

分布式技術追蹤 2017年第

常見 關鍵技術 blank 日誌 基礎架構 -c 多進程 nbsp rdb 分布式系統實踐 1. Linearizability 一致性驗證 http://dwz.cn/6pPYpb 摘要: 一致性是分布式系統很常見的特性, Jepsen是驗證分布式系統一致性的有力工具.

AGG第課 stroke_aa和outline_aa渲染線段效率對比

agg outline_aa stroke1 渲染代碼 void TestStrokeAAPerformance() { agg::rendering_buffer &rbuf = rbuf_window(); agg::pixfmt_bgr24 pixf(rbuf); typedef

)在所有的添加方法上記錄一下(添加操作)

end 若是 java args pack hand exceptio row ace 使用代理 /store/src/com/louis/utils/BeanFactory.java package com.louis.utils; import j

mysql 第篇文章~mysql5.7的安裝

kcon pre default one show hang 數據 c++ ica 一簡介:今天閑來無事,寫一篇基礎的 二 目的:給非DBA普及安裝mysql 5.7的源碼包安裝 三 步驟: 1安裝基礎環境 yum -y install gc

】thinkphp之curd操作

傳遞 nfa ace meta png 設置 顯示 logs 對象 1.數據創建(create) 接受提交過來的數據,比如表單提交的 POST(默認)數據。接受到數據後,還可以對數據進行有效的驗證、完成、生成等工作 // 這裏 create()方法就是數據創建,