aihot  2017-05-09 23:37:30  OpenCV |   查看评论   
示例:下面是C语言中的一个断言,用宏来设计的。(其中NULL为0L) 
#ifdef _EXAM_ASSERT_TEST_ // 若使用断言测试 

void ExamAssert( char * szFileName, unsigned int nLineNo ) 

printf( "\n[EXAM] Assert failed: %s, line %u\n", 
szFileName, nLineNo ) ; 
abort( ) ; 


#define EXAM_ASSERT( condition ) \ 
if ( condition ) \ // 若条件成立,则无动作 
NULL ; \ 
else \ // 否则报告 
ExamAssert( __FILE__, __LINE__ ) 

#else // 若不使用断言测试 

#define EXAM_ASSERT( condition ) NULL 

#endif /* ASSERT结束 */ 

<规则6> 用断言来检查程序正常运行时不应发生但在调测时有可能发生的非法情况。 

<规则7> 不能用断言代替错误处理来检查最终产品肯定会出现且必须处理的错误情况。 
如某模块收到其它模块或链路上的消息后,要对消息的合理性进行检查,此过程为正常的错误检查,不能用断言来代替。 

<规则8> 用断言确认函数的参数。 
示例:假设某函数参数中有一个指针,那么使用指针前可对它检查,如下。 
int ExamFunc( unsigned char *str ) 

EXAM_ASSERT( str != NULL ) ; // 用断言检查摷偕柚刚氩晃諗这个条件 

... // 其它程序代码 


<规则9> 用断言保证没有定义的特性或功能不被使用。 
示例:假设某通信模块在设计时,准备提供撐蘖訑和摿訑 这两种业务。但当前的版本中仅实现了撐蘖訑业务,且在此版本的正式发行版中,用户(上层模块)不应产生摿訑业务的请求,那么在测试时可用断言检查用户是否使用摿訑业务。如下。 
#define EXAM_CONNECTIONLESS 0 // 无连接业务 
#define EXAM_CONNECTION 1 // 连接业务 

int MsgProcess( _EXAM_MESSAGE *msg ) 

unsigned char cService ; /* 消息服务类 */ 

EXAM_ASSERT( msg != NULL ) ; 

cService = GetMsgServiceClass( msg ) ; 

EXAM_ASSERT( service != EXAM_CONNECTION ) ; // 假设不使用连接业务 

... // 其它程序代码 


<规则10> 用断言对程序开发环境(OS/Compiler/Hardware)的假设进行检查。 
程序运行时所需的软硬件环境及配置要求,不能用断言来检查,而必须由一段专门代码处理。用断言仅可对程序开发环境中的假设及所配置的某版本软硬件是否具有某种功能的假设进行检查。如某网卡是否在系统运行环境中配置了,应由程序中正式代码来检查;而此网卡是否具有某设想的功能,则可由断言来检查。 
对编译器提供的功能及特性假设可用断言检查,原因是软件最终产品(即运行代码或机器码)与编译器已没有任何直接关系,即软件运行过程中(注意不是编译过程中)不会也不应该对编译器的功能提出任何需求。 
示例:用断言检查编译器的int型数据占用的内存空间是否为2,如下。 
 

除特别注明外,本站所有文章均为 赢咖4注册 原创,转载请注明出处来自常见C/C++编码规范(7)

留言与评论(共有 0 条评论)
   
验证码:
[lianlun]1[/lianlun]