`
shangjava
  • 浏览: 1259032 次
  • 性别: 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

分享到:
评论

相关推荐

    用VC++编写的GPIB通讯实例

    在VC++中,实现GPIB通信需要使用特定的库或驱动。CONTEC的GPIB卡通常会提供对应的API函数库,这些函数封装了底层的硬件操作。例如,`gpib_init()`用于初始化GPIB系统,`gpib_send()`用于发送数据,`gpib_recv()`用于...

    VC++代码

    在VC++开发中,使用特定的功能或类库前需要包含相应的头文件。例如,本例中通过包含`HamiltonWebDBManager.h`和`ompanyList.h`来访问这些文件中定义的类或函数。 #### 1.2 条件编译指令 - `#ifdef _DEBUG`: 在...

    vc++6.0调试方法 还包括一些编译基础知识

    为了在非MFC程序中使用ClassWizard,可以在工程目录下创建一个空的`.RC`文件,并将其添加到工程中。这样,即使是在非MFC环境中也可以利用ClassWizard的功能来生成类和成员函数等。 #### 七、设置断点的方法 - **...

    vc++6.0如何调试

    #### 五、在非MFC程序中使用ClassWizard - 需要在工程目录下创建一个空的 `.RC` 文件并将其加入工程中,这样就可以正常使用ClassWizard了。 #### 六、断点设置 - 按 `F9` 在当前位置添加或删除断点。 - 使用 `Ctrl+...

    扫雷VC++完整源码

    VC++提供了资源管理工具,源码中会展示如何加载和使用这些资源。 7. **GUI设计**:游戏界面通常需要设计按钮、文本框和自定义控件。源码将展示如何创建和布局这些元素,以及如何响应用户的输入。 8. **多线程编程*...

    VC 使用断言宏检测程序的运行状态.rar

    在VC++编程环境中,断言宏(assert)是一种强大的调试工具,用于检查程序中的条件是否满足,以确保程序的正确性。"VC 使用断言宏检测程序的运行状态"这个主题,主要是关于如何利用assert宏来监控程序在运行时的状态...

    vc++11标准支持

    - **auto 关键字**:在VC++11中,可以使用`auto`关键字来声明变量,编译器会根据初始化表达式自动推导出变量的类型。这有助于减少冗余的类型声明,并提高代码的可读性和维护性。 **示例**: ```cpp auto i = 42...

    VC++调试技巧整理

    #### 五、非MFC程序中使用ClassWizard 1. **操作步骤**: - 在工程目录下创建一个空的`.RC`文件。 - 将该文件添加到工程中。 2. **注意事项**:这种方法可以让非MFC程序也能使用ClassWizard工具进行类的设计和...

    VC++程序界面,用于测试

    在VC++中开发程序时,开发者需要进行多个步骤来完成一个项目的创建和测试。首先,程序员需要创建一个新的工程,这通常涉及到选择工程类型和配置工程的属性。VC++支持多种工程类型,包括但不限于Windows应用程序、...

    VC++编程经验的一点总结

    在调试中,ASSERT和VERIFY是两种常用的断言工具。ASSERT在Release模式下不被编译,而在Debug模式下用于检查条件,当条件不满足时中断程序。VERIFY则在所有模式下都会编译,但它只在Debug模式下检查条件,确保代码的...

    vc++6.0调试方法(附有快捷键).pdf

    本文将主要讲述vc++6.0调试方法,包括如何快速规范代码缩进格式、在Release状态下进行调试、ASSERT和VERIFY的区别、Workspace和Project之间的关系、如何在非MFC程序中使用ClassWizard、如何设置断点、如何打开显示...

    VC++ 黑白道小游戏源码

    源码中可能使用了`try-catch`来捕获异常,以及`assert`语句进行断言检查,确保程序在预期状态下运行。 最后,游戏的图形界面设计也是关键。VC++的MFC提供了丰富的控件和绘图功能,开发者可以通过`CDC`(设备描述表...

    VC++ 类库参考手册

    MFC中的CDC(Device Context)类是对GDI的封装,使得在C++中使用GDI更加方便。 6. ATL(Active Template Library):ATL是微软提供的轻量级模板库,用于简化COM(Component Object Model)组件的开发。ATL使得创建...

    vc++6.0调试方法(附有快捷键)

    在非MFC项目中使用ClassWizard需要创建一个空的资源文件(.RC),并将该文件添加到项目中。这样就可以通过ClassWizard生成相应的类和成员函数。 #### 八、设置断点 - **快捷键**:`F9`可在当前光标位置添加或删除...

    VC++ 编程思想

    在《VC++ 编程思想》一书中,作者带着我们走进了编程世界的深处,不仅仅揭示了编程技巧本身,更重要的是,他强调了编程思维的培养。本书是对那些希望从非程序员逐步成长为程序员的初学者的极大鼓舞,它不仅提供了一...

    vc++ 筛选组合框

    在VC++编程环境中,"筛选组合框"是一个常见的交互元素,它允许用户从一组预定义的选项中选择一个或多个值。在这个项目中,我们可能会看到如何在MFC(Microsoft Foundation Classes)框架下创建和定制组合框...

    vc++经典函数介绍详解 两个pdf

    在VC++中,通常推荐使用`new`和`delete`操作符来管理内存。 6. `printf()` 和 `scanf()`:C语言风格的输入输出函数,`printf()`用于格式化输出,`scanf()`用于格式化输入。 7. `std::vector&lt;&gt;`:这是一个STL...

    VC++6.0 运行库参考手册

    在编程领域,Microsoft Visual C++ 6.0(简称VC++6.0)是一款经典的集成开发环境(IDE),它为C++开发者提供了强大的工具集。该环境包含一个运行库,是运行用VC++编译的程序所必需的组件。运行库不仅包括基本的C++...

    贪食蛇 VC++ 程序源代码

    7. **调试与优化**:源代码中可能还包含了一些调试和性能优化的技巧,如使用`assert`进行断言检查,或者使用适当的数据结构和算法提高程序效率。 通过分析这个项目,学习者不仅能了解C++编程的基本语法,还能掌握...

    VC++6.0小游戏之拼图源代码

    4. 事件驱动编程:在VC++6.0中,程序的执行依赖于用户输入或系统事件。开发者需要编写消息处理函数,如OnMouseMove、OnLButtonDown等,来响应用户的鼠标点击和移动,更新游戏状态。 5. 错误处理与调试:为了保证...

Global site tag (gtag.js) - Google Analytics