`
java-mans
  • 浏览: 11421270 次
文章分类
社区版块
存档分类
最新评论

WinXP环境中模仿WinCE的ASSERT表现行为的解决方案

 
阅读更多


//=====================================================================
//TITLE:
// WinXP环境中模仿WinCE的ASSERT表现行为的解决方案
//AUTHOR:
// norains
//DATE:
// Tuesday 23- February-2010
//Environment:
// WINDOWS CE 5.0
// WINDOWS XP
//=====================================================================

如果你开发过WinCE的程序,那么想必你对ASSERT宏的用法不陌生。简单点来说,该宏是在DEBUG版本才生效,当其表达式为FALSE时,调试器会自动停在该代码段,并且会在Output窗口输出相应的信息:

如果你将ASSERT(FALSE)放到WinXP的MFC工程的话,习惯于WinCE断言的方式的你,可能就会带你进入地狱。随着"咚"的一声,映入你眼帘的是这么一个警告信息:


刚在WinXP下编写程序的你,说不定看到这对话框,还以为自己的代码有了致命的错误呢。虽然我们可以点击"忽略"继续进行调试,但这对话框如果多来几个,我相信没几个人能忍受。

如果你不使用MFC,而是直接上WIN32 API的话,结局则更为离谱,你连编译都无法通过,直接提示ASSER没有定义。

查一下文档,WIN32确实没有ASSERT这玩意,但却有相应的替代,则是在该宏前加下划线,为_ASSERT。但这加下划线的也和MFC的ASSERT表现一样,会让你心跳加快:


好了,好了,基本上我们可以确认_ASSERT和ASSERT是同一个玩意,可以不用折腾了。但如果我们想获得在WinCE下的表现方式,那是不是就没辙了呢?

在讨论这个问题之前,我们先看看WinCE下关于ASSERT的定义是如何的。

归根结底,WinCE下的ASSERT用到了两个函数:NKDbgPrintfW和DebugBreak。我们很容易知道,NKDbgPrintfW是输出信息到Output窗口的函数,而DebugBreak则是让调试器暂停。

因为NKDbgPrintfW是WinCE特有的函数,所以我们先不管它,先看看DebugBreak。很幸运,这个函数在WinXP中也有定义。那么,我们将其放入代码里,看看其是什么表现。

当代码执行到DebugBreak()时,调试器也会跳出个对话框:


在该对话框中,如果选择Break,则会进入汇编代码的调试;如果是continue,则调试器会进入到下一语句。

虽然没有WinCE的那种静默的方式,但至少比那个带红红的"X",并且还有"咚"一声巨响的ASSERT好多了吧?

调试器的暂停我们算是不完美的解决了,那输出到Output窗口的信息该怎么办呢?NKDbgPrintfW可是WinCE的特权,WinXP可没有这个优待。在WinCE下,我们还能用printf输出到Output窗口,可是同样的调用,printf在WinXP下可就在Output窗口难觅踪影了。

查找文档,发现在WinXP下如果想将字符串输入到Output窗口,我们可以调用OutputDebugString。看起来问题能得到解决了,但其实OutputDebugString有个很大的缺陷,因为它不支持字符串的格式化!

换句话来说,如果将代码printf("Param:%d/r/n",iVal)替换为OutputDebugString("Param:%d/r/n",iVal),那么你将无法编译通过,因为OutputDebugString只支持一个形参!

难道,我们就没有办法在WinXP下实现一个和WinCE类似的ASSERT宏么?

没辙了,既然没有相应的格式化输出函数,那么我们自己弄一个不就行了么?

初始一看,整个函数的难点有两个,一个是可变参数,另一个是字符串格式化。其实这两个难点在wvsprintf上都能迎刃而解。它可以根据将可变形参格式化为字符串,然后保存到特定缓冲去。而这缓冲区的大小,根据文档,则为1024。所以,我们可以写出输出到output窗口的函数:

输出函数有了,那么我们接下来的事情是不是就简单多了?

最后,属于我们自己的ASSERT宏终于横空出世了:

分享到:
评论

相关推荐

    VC中如何使用ASSERT断言

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

    C语言头文件 ASSERT

    C语言头文件 ASSERTC语言头文件 ASSERTC语言头文件 ASSERTC语言头文件 ASSERTC语言头文件 ASSERTC语言头文件 ASSERTC语言头文件 ASSERTC语言头文件 ASSERTC语言头文件 ASSERTC语言头文件 ASSERTC语言头文件 ASSERTC...

    Assert.java

    适用于Java大部分非空判断,有效的减少空指针问题,直接调用Assert 里面的方法就行,非常方便,你值得拥有

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

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

    STM32中assert_param的使用

    本文介绍了使用STM32进行开发程序时,在库函数中遇到的assert_param的用法。

    assert在C语言中的使用

    在进行STM8S相关项目开发的过程中 看到assert_param(--)的使用,通常是判断函数的输入参数是否合格。找了一下的答案,关于assert的说明

    assert,assert_valid,verify,trace用法

    对于开始学vc的人,对于assert,assert_valid,verify,trace的宏感到很奇怪,总是觉得很难掌握似的,其实这些主要是没有理清楚他们各自宏之间深层次的意义。

    Visual assert

    Visual Assert is a Visual Studio® AddIn that allows you to easily write, manage, run, and debug your C/C++ unit tests – without ever leaving the Visual Studio® IDE. No fiddling with command line ...

    android用webview加载assert中的html并且可拨打页面中的电话

    android用webview加载assert中的html并且可拨打页面中的电话。

    VC中ASSERT的用法

    ASSERT( pcage!= NULL ) ASSERT( pcage->IsKindOf( RUNTIME_CLASS( CAge ) ) ) 编译过程中判断语句的成功(合法)函数 是一种断言语句。主要用来调试程序 就是说Debug(调试)的时候,ASSERT( *******) 这句要...

    assert.h头文件

    assert.h头文件下载

    assert函数

    介绍assert函数的具体用法 方便初学者学习

    vc中ASSERT()和VERIFY()区别

    ASSERT与VERIFY宏在Debug模式下作用基本一致,二者都对表达式的值进行计算,如果值为非0,则什么事也不做;如果值为0,则输出诊断信息。 ASSERT与VERIFY宏在Release模式下效果完全不一样。ASSERT不计算表达式的值,...

    Android读取Assert资源目录下数据库,数据库操作

    Android读取Assert资源目录下数据库,数据库操作; Android读取Assert资源目录下数据库,数据库操作 Android读取Assert资源目录下数据库,数据库操作

    assert()宏的用法

    assert()宏是用于保证满足某个特定条件。 用法是: assert(表达式); 如果表达式的值为假,整个程序将退出,并输出一条错误信息。如果表达式的值为真则继续执行后面的语句。 使用这个宏前需要包含头文件assert.h ...

    Java陷阱之assert关键字

     在Java中,assert关键字是从JAVA SE 1.4 引入的,为了避免和老版本的Java代码中使用了assert关键字导致错误,Java在执行的时候默认是不启动断言检查的(这个时候,所有的断言语句都将忽略!),如果要开启断言...

    Go语测试框架assert.zip

    Assert为Go语测试框架封装. 可以让我们熟悉的方式来写测试用例. 使用方式如下图: 标签:assert

    C#例子代码 A0002_Assert

    C#例子代码 A0002_AssertC#例子代码 A0002_AssertC#例子代码 A0002_AssertC#例子代码 A0002_AssertC#例子代码 A0002_AssertC#例子代码 A0002_AssertC#例子代码 A0002_AssertC#例子代码 A0002_AssertC#例子代码 A0002...

    systemverilog设计: assert 应用的例子(ncverilog测试过的)代码

    systemverilog设计: assert 应用的例子(ncverilog测试过的)代码 测试 , 设计

Global site tag (gtag.js) - Google Analytics