真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

C++中Assert()斷言機(jī)制怎么用-創(chuàng)新互聯(lián)

小編給大家分享一下C++中Assert()斷言機(jī)制怎么用,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!

讓客戶滿意是我們工作的目標(biāo),不斷超越客戶的期望值來自于我們對這個行業(yè)的熱愛。我們立志把好的技術(shù)通過有效、簡單的方式提供給客戶,將通過不懈努力成為客戶在信息化領(lǐng)域值得信任、有價(jià)值的長期合作伙伴,公司提供的服務(wù)項(xiàng)目有:域名注冊、虛擬空間、營銷軟件、網(wǎng)站建設(shè)、石景山網(wǎng)站維護(hù)、網(wǎng)站推廣。

MSDN原文如是說:

Evaluates an expression and, when the result is false, prints a diagnostic message and aborts the program.

(判斷一個表達(dá)式,如果結(jié)果為假,輸出診斷消息并中止程序。)

void assert(  
  int expression  
);

參數(shù):Expression (including pointers) that evaluates to nonzero or 0.(表達(dá)式【包括指針】是非零或零)

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

MSDN示例程序

// crt_assert.c 
// compile with: /c 
#include  
#include  
#include  
 
void analyze_string( char *string );  // Prototype 
 
int main( void ) 
{ 
  char test1[] = "abc", *test2 = NULL, test3[] = ""; 
 
  printf ( "Analyzing string '%s'\n", test1 ); fflush( stdout ); 
  analyze_string( test1 ); 
  printf ( "Analyzing string '%s'\n", test2 ); fflush( stdout ); 
  analyze_string( test2 ); 
  printf ( "Analyzing string '%s'\n", test3 ); fflush( stdout ); 
  analyze_string( test3 ); 
} 
 
// Tests a string to see if it is NULL,  
// empty, or longer than 0 characters. 
void analyze_string( char * string ) 
{ 
  assert( string != NULL );    // Cannot be NULL 
  assert( *string != '\0' );    // Cannot be empty 
  assert( strlen( string ) > 2 ); // Length must exceed 2 
}

輸出結(jié)果

Analyzing string 'abc' 
Analyzing string '(null)' 
Assertion failed: string != NULL, file assert.cpp, line 25 
 
abnormal program termination

用法總結(jié):

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

如:

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

 ...
}

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

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

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


3) 不能使用改變環(huán)境的語句,因?yàn)閍ssert只在DEBUG個生效,如果這么做,會使用程序在真正運(yùn)行時(shí)遇到問題


錯誤: assert(i++ < 100)

這是因?yàn)槿绻鲥e,比如在執(zhí)行之前i=100,那么這條語句就不會執(zhí)行,那么i++這條命令就沒有執(zhí)行。

正確: assert(i < 100);
         i++;

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

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

ASSERT只有在Debug版本中才有效,如果編譯為Release版本則被忽略掉。(在C中,ASSERT是宏而不是函數(shù)),使用ASSERT“斷言”容易在debug時(shí)輸出程序錯誤所在。

而assert()的功能類似,它是ANSI C標(biāo)準(zhǔn)中規(guī)定的函數(shù),它與ASSERT的一個重要區(qū)別是可以用在Release版本中。

使用assert的缺點(diǎn)是,頻繁的調(diào)用會極大的影響程序的性能,增加額外的開銷。

在調(diào)試結(jié)束后,可以通過在包含#include 的語句之前插入 #define NDEBUG 來禁用assert調(diào)用,示例代碼如下:

#include
#define NDEBUG
#include

加入#define NDEBUG之后,上文第一個例子輸出結(jié)果為:

Analyzing string 'abc' 
Analyzing string '(null)' 
Analyzing string ''

在面試中經(jīng)常用到的一個題目:

已知memcpy的函數(shù)為: void* memcpy(void *dest , const void* src , size_t count)其中dest是目的指針,src是源指針。不調(diào)用c++/c的memcpy庫函數(shù),請編寫memcpy。

void* memcpy(void *dst, const void *src, size_t count)   
{   
  //安全檢查 
  assert( (dst != NULL) && (src != NULL) );   
 
  unsigned char *pdst = (unsigned char *)dst;   
  const unsigned char *psrc = (const unsigned char *)src;   
 
  //防止內(nèi)存重復(fù) 
  assert(!(psrc<=pdst && pdst

以上是“C++中Assert()斷言機(jī)制怎么用”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對大家有所幫助,如果還想學(xué)習(xí)更多知識,歡迎關(guān)注創(chuàng)新互聯(lián)網(wǎng)站建設(shè)公司行業(yè)資訊頻道!

另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)建站www.cdcxhl.com,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場景需求。


本文標(biāo)題:C++中Assert()斷言機(jī)制怎么用-創(chuàng)新互聯(lián)
鏈接URL:http://weahome.cn/article/ddgjed.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部