1.1
char *pch = NULL;
pch = new char[100];if ( NULL != pch ) //这里不适合用ASSERT,因为Release版本会忽略内存是否
{ //分配成功的检查
...
}1.2
CListCtrl* pListCtrl = (CListCtrl*) GetDlgItem(IDC_YOURLISTCONTROL);
ASSERT(pListCtrl != NULL); //MSDN中是这样的 POSITION pos = pList->GetFirstSelectedItemPosition();
if (pos == NULL)
TRACE0("No items were selected!\n");
else
{
while (pos)
{
int nItem = pList->GetNextSelectedItem(pos);
TRACE1("Item %d was selected!\n", nItem);
// you could do your own processing on nItem here
}
}问题:
1.这里用ASSERT,那Release版本将不会对pListCtrl是否为NULL进行检查,这是否有影响Release版本的质量?为什么?
2.如果用if ( pListCtrl != NULL ) { ... },功能上当然可以,但从代码质量上,若ASSERT()不影响Release版本的质量,则用ASSERT更合适,这样可以减少Release中的执行代码.这样对吗?
3.除函数入口处适合用ASSERT外,还有什么地方适合(即不影响Release版本的质量)用ASSERT呢?
char *pch = NULL;
pch = new char[100];if ( NULL != pch ) //这里不适合用ASSERT,因为Release版本会忽略内存是否
{ //分配成功的检查
...
}1.2
CListCtrl* pListCtrl = (CListCtrl*) GetDlgItem(IDC_YOURLISTCONTROL);
ASSERT(pListCtrl != NULL); //MSDN中是这样的 POSITION pos = pList->GetFirstSelectedItemPosition();
if (pos == NULL)
TRACE0("No items were selected!\n");
else
{
while (pos)
{
int nItem = pList->GetNextSelectedItem(pos);
TRACE1("Item %d was selected!\n", nItem);
// you could do your own processing on nItem here
}
}问题:
1.这里用ASSERT,那Release版本将不会对pListCtrl是否为NULL进行检查,这是否有影响Release版本的质量?为什么?
2.如果用if ( pListCtrl != NULL ) { ... },功能上当然可以,但从代码质量上,若ASSERT()不影响Release版本的质量,则用ASSERT更合适,这样可以减少Release中的执行代码.这样对吗?
3.除函数入口处适合用ASSERT外,还有什么地方适合(即不影响Release版本的质量)用ASSERT呢?
还有一个问题。ASSERT称为断言,表示它判断的语句原则上必须成立,否则程序可能无法执行的情况才需要使用。而对于一般影响不是那么大的问题,没有必要用ASSERT语句。可以用TRY,CATCH来处理。
通常用于内部函数之间传递参数时的约定检查,外部接口函数则不适合
release下是
# define ASSERT(f)((void)0)所以在release下多用VERIFY
# define VERIFY(f)((void)(f))