📄 使用 mfc的 assertions.htm
字号:
face="arial,helvetica" style="FONT-SIZE: 12px" ;></p> <table cellPadding="5" width="100%"><TBODY> <tr> <td bgColor="#ccccff"><font face="arial,helvetica" style="FONT-SIZE: 12px" ;><pre>//ASSERT(p != 0);do { if(!(p != 0) && AfxAssertFailedLine(__FILE__, __LINE__)) AfxDebugBreak(); } while(0);//ASSERT((size >= 100);do { if(!(size >= 100) && AfxAssertFailedLine(__FILE__,__LINE__)) AfxDebugBreak(); } while(0);</font></pre> </td> </tr></TBODY> </table> <p>D0-while</font><font style="FONT-SIZE: 12px" ;>循环将整个</font><font face="arial,helvetica" style="FONT-SIZE: 12px" ;>assertion</font><font style="FONT-SIZE: 12px" ;>封装在一个单独的程序块中,使得编译器编译起来很舒畅。</font><font face="arial,helvetica" style="FONT-SIZE: 12px" ;>If</font><font style="FONT-SIZE: 12px" ;>语句将求取表达式的值并且当结果为零时调用</font><font face="arial,helvetica" style="FONT-SIZE: 12px" ;>AfxAssertFailedLine()</font><font style="FONT-SIZE: 12px" ;>函数。这个函数将弹出一个对话框,其中提供三个选项“取消、重试或忽略”,当你选取“重试”时,它将返回</font><font face="arial,helvetica" style="FONT-SIZE: 12px" ;>TRUE</font><font style="FONT-SIZE: 12px" ;>。重试将导致对</font><font face="arial,helvetica" style="FONT-SIZE: 12px" ;>AfxDebugBreak()</font><font style="FONT-SIZE: 12px" ;>函数的调用,从而激活调试器。</font><font face="arial,helvetica" style="FONT-SIZE: 12px" ;></p> <p>AfxAssertFailedLine() </font><font style="FONT-SIZE: 12px" ;>是一个未正式公布的函数,考虑到它唯一的功能就是显示一个消息框,它的复杂性就令人十分惊奇了。该函数的源代码驻留在</font><font face="arial,helvetica" style="FONT-SIZE: 12px" ;>afxasert.cpp</font><font style="FONT-SIZE: 12px" ;>中,在该文件中你将发现这个函数使用了不寻常的方法来确保消息框被实际显示出来。例如,</font><font face="arial,helvetica" style="FONT-SIZE: 12px" ;>assertion</font><font style="FONT-SIZE: 12px" ;>的失败发生在你的程序已经投递出</font><font face="arial,helvetica" style="FONT-SIZE: 12px" ;>WM_QUIT</font><font style="FONT-SIZE: 12px" ;>消息之后,</font><font face="arial,helvetica" style="FONT-SIZE: 12px" ;>AfxAssertFailedLine()</font><font style="FONT-SIZE: 12px" ;>函数就必须临时从消息队列中清除该消息以便显示消息框。</font><font face="arial,helvetica" style="FONT-SIZE: 12px" ;></p> <p>AfxAssertFailedLine</font><font style="FONT-SIZE: 12px" ;>函数中的</font><font face="arial,helvetica" style="FONT-SIZE: 12px" ;>_FILE_</font><font style="FONT-SIZE: 12px" ;>和</font><font face="arial,helvetica" style="FONT-SIZE: 12px" ;>_LINE_</font><font style="FONT-SIZE: 12px" ;>语句是处理器标志,它们分别指定了源文件名和当前的行号。这是</font><font face="arial,helvetica" style="FONT-SIZE: 12px" ;>ASNI</font><font style="FONT-SIZE: 12px" ;>的标准定义,由编译器自动产生。</font><font face="arial,helvetica" style="FONT-SIZE: 12px" ;></p> <p></font><b><font color="#990033" size="+1" face="arial,helvetica" style="FONT-SIZE: 12px" ;>VERIFY </font><font style="FONT-SIZE: 12px" ; color="#990033" size="+1">宏</font></b><font face="arial,helvetica" style="FONT-SIZE: 12px" ;></p> <p></font><font style="FONT-SIZE: 12px" ;>因为</font><font face="arial,helvetica" style="FONT-SIZE: 12px" ;>assertion</font><font style="FONT-SIZE: 12px" ;>只能在你的程序的调试版本中起作用,因此它测试的表达式总是被动的。也就是说,表达式中不可以包含赋值语句、增加语句(</font><font face="arial,helvetica" style="FONT-SIZE: 12px" ;>++</font><font style="FONT-SIZE: 12px" ;>)或者是减少语句(</font><font face="arial,helvetica" style="FONT-SIZE: 12px" ;>--</font><font style="FONT-SIZE: 12px" ;>)这些实际改变你的数据的语句(否则发行版和调试版的程序就会产生不同</font><font face="arial,helvetica" style="FONT-SIZE: 12px" ;>-</font><font style="FONT-SIZE: 12px" ;><font color="#FF0000">站长注</font>)。某些情况下你可能想要验证一个能动的表达式,典型地</font><font face="arial,helvetica" style="FONT-SIZE: 12px" ;>-</font><font style="FONT-SIZE: 12px" ;>一个赋值语句。那么就到了用</font><font face="arial,helvetica" style="FONT-SIZE: 12px" ;>VERIFY</font><font style="FONT-SIZE: 12px" ;>宏来替代</font><font face="arial,helvetica" style="FONT-SIZE: 12px" ;>ASSERT</font><font style="FONT-SIZE: 12px" ;>的时候了。这里是一个例子:</font><font face="arial,helvetica" style="FONT-SIZE: 12px" ;></p> <table cellPadding="5" width="100%"><TBODY> <tr> <td bgColor="#ccccff"><font face="arial,helvetica" style="FONT-SIZE: 12px" ;><pre>void foo(char* p,int size){char* q; // working copy of pointer VERIFY(q = p); // copy buffer pointer and validateASSERT((size >= 100); // make sure buffer is at least 100 bytes// Do the foo calculation}</font></pre> </td> </tr></TBODY> </table> <p></font><font style="FONT-SIZE: 12px" ;>在调试模式下,</font><font face="arial,helvetica" style="FONT-SIZE: 12px" ;>ASSERT</font><font style="FONT-SIZE: 12px" ;>和</font><font face="arial,helvetica" style="FONT-SIZE: 12px" ;>VERIFY</font><font style="FONT-SIZE: 12px" ;>是一回事,但是在发行模式下,</font><font face="arial,helvetica" style="FONT-SIZE: 12px" ;>VERIFY</font><font style="FONT-SIZE: 12px" ;>宏仍然测试表达式而</font><font face="arial,helvetica" style="FONT-SIZE: 12px" ;>assertion</font><font style="FONT-SIZE: 12px" ;>却不起任何作用。可以从效果上这样说,在发行模式下,</font><font face="arial,helvetica" style="FONT-SIZE: 12px" ;>ASSERT</font><font style="FONT-SIZE: 12px" ;>语句被删除了。</font><font face="arial,helvetica" style="FONT-SIZE: 12px" ;></p> <p></font><font style="FONT-SIZE: 12px" ;>虽然你可以在</font><font face="arial,helvetica" style="FONT-SIZE: 12px" ;>MFC</font><font style="FONT-SIZE: 12px" ;>的源程序中发现一些</font><font face="arial,helvetica" style="FONT-SIZE: 12px" ;>VERIFY</font><font style="FONT-SIZE: 12px" ;>的例子,但是</font><font face="arial,helvetica" style="FONT-SIZE: 12px" ;>ASSERT</font><font style="FONT-SIZE: 12px" ;>却显然更加普遍一些,有些程序员完全不用</font><font face="arial,helvetica" style="FONT-SIZE: 12px" ;>VERIFY</font><font style="FONT-SIZE: 12px" ;>,因为他们已经习惯于采用被动的</font><font face="arial,helvetica" style="FONT-SIZE: 12px" ;>ASSERT</font><font style="FONT-SIZE: 12px" ;>。请记住,如果你在一个</font><font face="arial,helvetica" style="FONT-SIZE: 12px" ;>ASSERT</font><font style="FONT-SIZE: 12px" ;>语句中错误地使用了一个能动的表达式,编译器将不做任何警告地忽略它。在发行模式下,该表达式就会被无声息地删除掉,这将会导致程序的错误运行。由于发行版的程序通常不包含调试信息,这类错误将很难被发现。</font><font face="arial,helvetica" style="FONT-SIZE: 12px" ;></p> <p align="right"></font><font style="FONT-SIZE: 12px" ;><a href="assertions2.htm"><b>下一章</b></a></font></td> </tr></TBODY> </table> </td> </tr></table></body></html>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -