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;
}}
可不可以这样理解,当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;
}}
所以只对debug版本有效,对于release版本没效的这个宏主要是调试的时候提醒一下,这里出错了
一般是判断如果错误下面的执行就无效了就用这个断言,为了的调试阶段消除错误。在release下这句在编译的时候就跳过了
所以真正安全的是代码二的写法。这样避免出错。
如果代码一在release下有一个指针为空的话,下面用指针的时候执行就会报错的。
1) 是这样的,断言的目的就是在debug时发现可能引起程序崩溃的错误,通过断言的形式对编程者加以提醒。
如果debug版过了,表示你的逻辑运行没有错误了。在Release时就不需要再进行断言判断了。提高程序运行效率
2)代码一比代码二要好,虽然代码二在运行时,可以保证这个函数没有逻辑错误,但是在功能实现上却不严谨。因为代码二
在有的情况下没有达到所要的达到的效果。
正确的写法是代码一的写法