您的位置: 旅游网 > 综艺 >> 卫视

中用于调试程序的宏

发布时间:2021-10-28 05:38:43

ASSERT()

ASSERT()被测试它的参数,若参数为0,则中断执行并打印一段说明消息。在 Release 版本的程序中它不起任何作用。ASSERT()使用的时候必须保证参数表达式中不能有函数调用(译者注:ASSERT()宏在 Release 版本中不对表达式求值),因此对于任何有函数调用的参数表达式,应该使用宏 VERIFY(),以保证表达式中的函数调用在 Release 版本中会被正确求值。

断言(assertion)用带断言信息(程序, 模块, assertion行)的对话框执行. 对话框有3个按钮: \"Break\", \"Repeat\" (\"Debug\"), and \"Continue\" (\"Ignore\"). \"Break\" 结束程序, \"Continue\" 忽略断言, 最有用的是\"Repeat\"按钮. 按下它在断言的地方打开源代码器. 在这里你可以测试所有的变量值并明白哪里出了问题。

例如:ASSERT(pPointer);ASSERT(n0 n100);ASSERT(0);

ASSERT在执行简单验证时很有用,但对于C++对象,特别是由CObject派生的对象,则有更好的方法ASSERT_VALID来实现类似操作。作为一般规则,我们应在开始使用每一个对象之前检查数据讹误,

ASSERT_VALID宏使得对CObject的派生类实现该操作非常简单。

例如:ASSERT_VALID(this);ASSERT_VALID(pView);

VERIFY()

VERIFY()和 ASSERT()很相似,区别在于在 Release 版本中它仍然有效(译者注:原作者在这里没有讲清楚,VERIFY()不会打印说明,只是会对参数表达式求值)。

TRACE()

TRACE()基本上就是函数 printf()的一个复制品,唯一的区别是它把结果输出到调试窗口。在 Release 版本中,它也是无效的。一般是用TRACE0(),TRACE1(),TRACE2()…而不用TRACE()。

这三个宏在 Release 版本中都不会产生任何实质性的影响,它们是否起作用取决于是否定义了预定义了宏 _DEBUG。这是对 Microsoft Visual C++ 而言,在其它的编译器中可能其它不同的宏。

常用用法:

为了控制传进的指针:

void SomeFun(SomeType* pPointer)

{

ASSERT(pPointer);

//some instructions.

}

你可以在\"switch\" 和 \"if\"操作中捕获奇怪的值

例如:

switch(nRGBColors){

case nRed: {//some instructions.} break;

case nGreen: {//some instructions.} break;

case nBlue: {//some instructions.} break;

default: ASSERT(0); // we should have never come here!

}

if(nWaterTemp =0 nWaterTemp 50){

//some instructions.

}

else if(nWaterTemp = 50 nWaterTemp = 100){

IBM发布了专为大数据处理打造的专家集成系统PureData //some instructions.

}

else{

ASSERT(0); // we should have never come here!

}

对值的断言:

ASSERT(nSomeValue = MinValue and nSomeValue = MaxValue);

ASSERT(nOtherValue != 0);

可爱的 ASSERT 错误

ASSERT( m_eate() );

呕! 这是一个可怕的错误! 程序在调试版中正常工作, 在发行版中不工作. 记住: 这是一个在发行版中将被移除的宏. 以这种方法你的窗口将永远不会被创建. 如果你用 MFC, 这样做:

VERIFY( m_eate() );

它在调试版中像ASSERT一样并且在发行版中执行m_eate()。

杭州子宫内膜炎治疗多少钱
脚扭伤吃什么药
铜仁白癜风医院哪家医院好
猜你会喜欢的
猜你会喜欢的