`
ihuashao
  • 浏览: 4547392 次
  • 性别: Icon_minigender_1
  • 来自: 济南
社区版块
存档分类
最新评论

在VC++中使用斷言

阅读更多

VC++中使用斷言

1??????? 斷言的表達形式

1.1????? 語法

斷言是一個宏,格式為: ASSERT( 邏輯表達式 booleanExpression)

邏輯表達式可以是任意一個表達式,其值是0或者非0。

從代碼的可讀性角度來講,這個表達式應該是不包含與布爾型變量的邏輯比較操作的。

1.2????? 作用

斷言僅僅在Debug過程中產生作用。

當邏輯表達式出現了FALSE(0)的時候,編譯程序將自動停止程序的運行,並給出相關的程序診斷信息。

對於Release版本的代碼,ASSERT宏不會被處理,因而不會對程序的正常運行其任何阻攔作用。對於MFC,假如希望在Release版本中依然有類似的功能,可以使用VERIFY宏。該宏作用和斷言類似。

1.3????? 診斷信息

assertion failed in file <file name> in line <line number></line></file>

以上為診斷信息的格式。其中file name代表了出錯程序代碼所在的文件,line number是該出現問題的斷言所在行。

2??????? 斷言的使用方法

2.1????? 函數調用正確性檢查

可以檢查函數參數的合理性。

在實際工作中,有些函數需要輸入參數滿足一些假定條件,而這些約束條件不是數據類型可以滿足的。比如下面的代碼,要根據三個邊長求一個直角三角形的某些參數,必須確認這三個邊長是合理的。

Type GetValue(int a, int b, int c)

{

??? ASSERT( (a  //specify the third parameter as the largest

??? ASSERT( (a * a + b * b) == c*c )

??? //To do something

………

//End function

}

在這裡,斷言第三個參數必須是最大的邊長,之後,進一步要求兩個短邊的平方和必須等於長邊的平方。

類似的,我們可以用判斷主調給出的指針是否有效。

……

ASSERT(NULL != pOutBuffer)

…...

在函數內檢測參數的合理性有兩個好處:

1 保證函數本身的健壯性;

2 使問題容易定位。

主調給出的參數有時候可能是莫名其妙的,使用斷言,能夠發現許多難以發現的邏輯錯誤。

2.2????? 檢查內存分配

MFC中,由於windows的虛擬內存,Release以後的程序是不可能耗盡內存的。因此,如果用普通代碼檢查分配內存成功與否,效率是不合算的,最好使用斷言。

例如:

……

pBuf = (char *) malloc( sizeof(char) * 100 );

ASSERT( NULL != pBuf )

……

這樣既不降低碼執行效率,又能檢查分配內存是否成功。

2.3????? 防治野指針

大概在定義指針的時候人人都懂得初始化吧:

int *pCount = NULL;

然後分配空間,

pCount = new int[ 10 ];

 process…

? 之後釋放空間:

 delete []pCount;

 這時候,pCount指向哪裡呢? 還是原來的地址,然而改地址已經被系統釋放了,於是這個指針就變成了野指針”,如果使用,必然導致錯誤。在這裡,應該使用斷言來確保賦了NULL值。

 pCount = NULL;

? ……

? ASSERT ( NULL == pCount ); //if you’ve forgotten delete,here will output an alart.

? 牢記,在給一個指針釋放空間之後用斷言確保這個指針已經賦了NULL,以免出現野指針。

2.4????? MSDN範例

// example for ASSERT<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

CAge* pcage = new Cage[ 21 ]; // CAge is derived from CObject.

ASSERT( pcage!= NULL )

ASSERT( pcage->IsKindOf( RUNTIME_CLASS( CAge ) ) )

// Terminates program only if pcage is NOT a CAge*.

以上為MSDN中對於斷言使用的範例,在這裡確保了pcage指向的對象是有效的Cage類。

3??????? 注意事項

1 斷言捕捉的是非法操作的情況,而不是錯誤。不要試圖用斷言來排錯。

2 一旦函數對參數有任何假定,一定要在函數的入口處使用斷言來確認假定是否實現。

3 給每一個斷言加上注釋,以便使斷言有目的的防錯。

?

參考資料

1 Steve Maguire, Writing Clean Code.

2林銳,高質量C/C++編程指南

3 Microsoft,MSDN document

?

V1.0 2003/9/9

分享到:
评论

相关推荐

    JMETER 断言几种方式

    在JMETER 性能测试过程中间,为了检查测试中得到的响应内容是否跟预期一致,所以,今天讲解一个新的组件断言,英文名称(Assertion),它的作用和loadrunner中的检查点类似. 使用断言的目的:在request的返回层面增加一...

    Jmeter中断言的使用方法.doc

    Jmeter中断言的使用方法.doc

    VC中如何使用ASSERT断言

    VC中如何使用ASSERT断言 VC中如何使用ASSERT断言

    python中断言的用法(1).docx

    在Python中,断言是一个关键字,用于检查一个条件是否为真。如果条件为假,断言会引发一个AssertionError异常。 断言的语法如下: assert condition, message 其中,condition是要检查的条件,message是可选的错误...

    Java中断言使用案例

    文档表示java中断言的使用,使用断言的好处,以及怎么使用

    SQL server中实现断言

    在SQL中可以使用数据定义语言中的CREATE ASSERTION语句,通过声明性断言(declarative assertions)来指定更具一般性的约束。可以定义涉及多个表或聚集操作的比较复杂的完整性约束。断言创建以后,任何对断言中所...

    assert, 在库和业务模型中,使用瘦断言库.zip

    assert, 在库和业务模型中,使用瘦断言库 assert 一个简单的php库,它包含在业务模型中输入验证( 不过滤)的断言和保护方法。 库可以用于在输入数据上实现 pre-/post条件。思想是减少在模型中实现断言的代码量,同时...

    eclipse如何开启断言assert

    eclipse如何开启断言assert调试,文档详细的讲解了配置的流程。

    python中断言的用法.docx

    Python中断言的语法非常简单,只需要使用assert关键字即可。assert语句的一般形式如下: assert expression [, arguments] 其中,expression是一个布尔表达式,如果为False,则抛出AssertionError异常。arguments是...

    VC++2010权威开发指南+源代码.part2

     5.21.3 在日期和时间选择器控件中使用自定义格式字符串 254  5.21.4 在日期和时间选择器控件中使用回调字段 254  5.21.5 处理日期和时间选择器控件中的通知消息 256  5.22 Visual C++ 2010 Month Canlendar控件...

    一个使用断言来做应用的Log系统的Delphi单元

     一个使用断言来做应用的Log系统的单元。  使用这个单元时,用户的应用程序中,原来定义错误消息输出时的代码:  ______________________________________________________  {$IFDEF Debug}  Debugger....

    Go-assertgo-在Go中添加条件编译断言的一个微小库

    assertgo - 在Go中添加条件编译断言的一个微小库

    深入探讨C++中的引用和ASSERT断言

    深入探讨C++中的引用和ASSERT断言,对引用和断言的理解会有很大的帮助

    python:playwright 自动等待和断言(csdn)————程序.pdf

    python:playwright 自动等待和断言(csdn)————程序

    python-断言方式.docx

    python 断言方式 Python 断言方式 在 Python 中,断言是一种用于检查代码是否按照预期执行的方法。它是一种用于测试代码的工具,可以帮助开发人员在代码中发现错误和问题。断言是一种简单而有效的方法,可以在代码中...

    静态断言(编译时断言)

    静态断言(编译时断言)不同于运行时断言哈。

    jmeter实例(json断言+参数化)

    jmeter实例(json断言+参数化),检查点详细介绍、正则表达式使用方法、JSON断言、CSV参数化

    python-断言方式(1).docx

    python 断言方式 Python 断言方式 在 Python 中,断言是一种用于检查代码是否按照预期执行的方法。它是一种用于测试代码的工具,可以帮助开发人员在代码中发现错误和问题。断言是一种简单而有效的方法,可以在代码中...

    论文研究-基于断言的验证方法在模块级验证中的应用 .pdf

    基于断言的验证方法在模块级验证中的应用,顾冲,贺光辉,本文以AHB Arbiter的验证为例,介绍了一种在模块级上比传统IC验证方法效率更高的验证方法--基于断言的验证,这种验证方法使一些原先难

    jmeter配合CSV,JSON断言测试

    jmeter配合CSV,JSON断言测试,有demo可以用

Global site tag (gtag.js) - Google Analytics