1) assert 对Debug 版起作用, 对 Release 版不起作用.
   可不可以这样理解,当assert在Debug版不出问题时,在Release 版也不出问题.2) 以下二代段码有什么不同,请解释一下.(是不是在Release 版,有 代码二的代码量 比 代码一的代码量 大的问题)代码一:
void *memcpy(void *pvTo, const void *pvFrom)
{
     assert((pvTo != NULL) && (pvFrom != NULL));   //assert的参数为假中止, 为真继续执行
      
     byte *pbTo = (byte *)pvTo;
     .......     return pvTo;
}代码二:
void *memcpy(void *pvTo, const void *pvFrom)
{     if ((pvTo != NULL) && (pvFrom != NULL))
     {
       byte *pbTo = (byte *)pvTo;
       .......       return pvTo;
     }
     else
     {
       return NULL;
     }}

解决方案 »

  1.   

    ASSERT宏只DEBUG版本中起作用,在RELEASE版本中ASSERT宏将被忽略。assert就是用来防止出错的,比如如果用代码二,那么你调用完了以后后面代码还是继续执行的吧 这样的就有可能出错,因为函数没有达到要的效果,代码一就直接终止运行了
      

  2.   

    ASSERT在Debug中才会有用,在Release的版本的时候由于预编译宏的改变,ASSErt宏的检查代码不会执行了
      

  3.   

    assert宏有预编译条件#ifdef _Debug
    所以只对debug版本有效,对于release版本没效的这个宏主要是调试的时候提醒一下,这里出错了
    一般是判断如果错误下面的执行就无效了就用这个断言,为了的调试阶段消除错误。在release下这句在编译的时候就跳过了
    所以真正安全的是代码二的写法。这样避免出错。
    如果代码一在release下有一个指针为空的话,下面用指针的时候执行就会报错的。
      

  4.   

    这东西在Release版本中不起作用了,你可以把它看做是注释。其实这个东西,就像是警察在演习时全副武装,抓坏人时却是赤膊上阵。是有一些不合理。
      

  5.   


    1) 是这样的,断言的目的就是在debug时发现可能引起程序崩溃的错误,通过断言的形式对编程者加以提醒。
       如果debug版过了,表示你的逻辑运行没有错误了。在Release时就不需要再进行断言判断了。提高程序运行效率
    2)代码一比代码二要好,虽然代码二在运行时,可以保证这个函数没有逻辑错误,但是在功能实现上却不严谨。因为代码二
       在有的情况下没有达到所要的达到的效果。
       正确的写法是代码一的写法