📄 subject_23548.htm
字号:
<p>
序号:23548 发表者:矿工王保保 发表日期:2002-12-04 22:40:59
<br>主题:谁知道关于assert? 送分!!!
<br>内容:我看一本书叫做编程精粹,关于c语言的。里面有这样的话。谁能理解,帮忙分析分析!<BR>1 断言是进行调试检查的简单方法。要使用断言捕捉不应该发生的非法情况。不要混淆非法情况和错误情况之间的区别,后者是在最终产品中必须处理的。<BR>2同时维护调试和非调试(即交付)两个版本,在程序的编写过程中,变仪器调试版本,利用它提供的测试部分再增加程序功能是自动的进行查错。在程序编完后,编译其交付版本,封装之后交给经销商。<BR><BR>能不能结合assert说说?c/c++中都有assert.调试版本中的assert难道要在交付版本中全部注释掉么?还是不用注释,其不会发生作用。还是其作用还会继续,而且是必要的。我是个初级程序员,这些概念搞不懂!!
<br><a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p>
<hr size=1>
<blockquote><p>
回复者:口水龙 回复日期:2002-12-05 00:40:05
<br>内容:不用注释,其在release版本中不会发生作用。而且里面的语句在release版本也不执行。
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:矿工王保保 回复日期:2002-12-05 10:13:10
<br>内容: 如果我用c++,编了一个程序,怎么才能知道它是什么版本呢?要做哪些工作才能确定它是debug还是 release版本?更明确一点吧,怎么才是debug 或者 release 版本,怎么从来没有涉及到这些。<BR> 能简单明了的讲一下么,最好举个小例子,有小代码最好!!!
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:凯凯 回复日期:2002-12-05 10:21:33
<br>内容:在VC的菜单条的空白地方按鼠标右键,在弹出的菜单中选中Build项。<BR>这时会出现一个工具条,工具条上的第二个下拉框就可以选择“Win32 Debug”或“Win32 Release”,同时也指示出了工程当前的编译方式。<BR><BR>如果选择了Win32 Release编译方式,VC会自动将断言全部注释掉。
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:矿工王保保 回复日期:2002-12-05 13:07:24
<br>内容: 凯凯兄,这麽说您的意思是不是如果我们自己用纯c++编程的话,还必须自己把断言注释掉。换句话说,断言是程序的一部分,程序不知道他自己是什么版本,必须人为地把断言注释掉。<BR> 听说好像断言和一个叫debug的宏有关系。<BR> 凯凯兄,能不能讲得更清楚一些呢,让小弟编程时使用断言而不用提心吊胆的
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:凯凯 回复日期:2002-12-05 13:10:58
<br>内容:断言本身也是一个宏,如果用纯C++编程的话,你可以自己实现它。<BR><BR>
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:矿工王保保 回复日期:2002-12-05 13:31:18
<br>内容:这个我知道一点儿,这麽说吧<BR>我写了一个函数<BR>fucntion1( char *p )<BR> {<BR> assert(p!=null);<BR> <BR> ......<BR> }<BR><BR>这是一个断言,那么在这个函数的交付版本中,我是不是要亲自把这个断言去掉。要是不用除掉,为什么,这个断言还会其作用么?<BR>fucntion1( char *p )<BR> {<BR> //assert(p!=null);<BR><BR> ....<BR> }<BR><BR>
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:凯凯 回复日期:2002-12-05 13:51:59
<br>内容:没有什么的,你不去掉也可以。去掉只是使代码更紧凑,更快一点。
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:矿工王保保 回复日期:2002-12-05 14:00:33
<br>内容:不好意思,<BR><BR>我还是有点不太明白,我怎样使我自己编的程序有两个版本<BR><BR> 您的意思是不是我编了一个程序,其中使用了 断言 ,调试的时候它其作用,然而调试完了,就不用管他了么??它把其他程序调用时不会执行断言,我有点不太相信。
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
<font color=red>答案被接受</font><br>回复者:凯凯 回复日期:2002-12-05 14:50:43
<br>内容:在调试时,对于每一个函数一般都要检查输入参数的合法性。但这样的检查是很费时的。<BR>在发布程序时,你基本可以肯定输入的参数都是合法的,不需要这种检查,这时你可能想把它去掉。如果你所用了断言就很方便了。<BR>另外你编代码肯定有两个版本,如果没有Debug版本你怎么去调试,怎么去单步执行?找本VC的书看看,再上机去试试吧。
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:rubbish 回复日期:2002-12-05 15:59:08
<br>内容:assert是用来排除在程序调试过程中出现的异常现象,只是在调试的过程中起作用,比如你写的原程序可能其他人还会用,重新编译时assert仍然起作用。<BR>编译中你可以选择是debug版本还是release 版本,交付给用户的是release版本,它比debug要小,那里面assert是不会起作用的,系统自动实现的,不用你再去屏蔽。
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:白云 回复日期:2002-12-05 17:35:46
<br>内容:看来保保兄不大清楚宏的定义,下面一个例子可以说明一下。<BR>#define MYDEBUG 1<BR><BR>main()<BR>{<BR>#if MYDEBUG<BR>printf("错误")<BR>#endif<BR>}<BR>如果MYDEBUG为1则输出,为0则不输出<BR>这样就利用宏MYDEBUG来控制错误信息的输出,很简单的例子是吧。再看下面一个例子:<BR>#define MTASSERT( a ) _ASSERTE( a )<BR><BR>#define MTASSERT( a ) if( !(a) )PrintError( #a, __FILE__, __LINE__, GetLastError())<BR><BR>void PrintError( LPSTR linedesc, LPSTR filename, int lineno, DWORD errnum);<BR><BR>static void PrintError( LPSTR linedesc, LPSTR filename, int lineno, DWORD errnum)<BR>{<BR> LPSTR lpBuffer;<BR> char errbuf[256];<BR>#ifdef _WINDOWS<BR> char modulename[ MAX_PATH ];<BR>#else <BR> DWORD numread;<BR>#endif<BR> FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER|FORMAT_MESSAGE_FROM_SYSTEM,<BR> NULL,<BR> errnum,<BR> LANG_NEUTRAL,<BR> ( LPTSTR )&lpBuffer,<BR> 0,<BR> NULL);<BR> wsprintf(errbuf, "\nThe following call failed at line %d in %s:\n\n%s\n\nReason:%s\n",lineno, filename,linedesc,lpBuffer);<BR>#ifndef _WINDOWS<BR> WriteFile(GetStdHandle(STD_ERROR_HANDLE),errbuf,strlen(errbuf),&numread,FALSE );<BR> Sleep(3000);<BR>#else <BR> GetModuleFileName(NULL, modulename, MAX_PATH );<BR> MessageBox(NULL, errbuf, modulename,<BR> MB_ICONWARNING|MB_OK|MB_TASKMODAL|MB_SETFOREGROUND );<BR> exit( EXIT_FAILURE);<BR>#endif<BR><BR>}<BR>这是我自己用的一个类似断言的宏,当_ASSERTE( a )中a为假,则输出:出错文件名,出错行号,出错原因;并且,可以分别是控制台输出和窗口输出。那么,问题是,如果我要编译交付版本怎么办呢,非常容易,<BR>只要将#define MTASSERT( a ) _ASSERTE( a )注释掉,然后再加上<BR>#define _ASSERTE( a ) a 这样,你的程序就不会加入任何的调错代码了。当然,VC中的ASSERT应该比上面的要复杂一些,而且它输出的是Debug窗口。<BR>
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -