代码规范_2:防御编码_c/c++
2016-03-22 21:15
555 查看
子程序
引入中间、易懂的抽象避免代码的重复
子类化
隐藏顺序(合并需要顺序的操作)
隐藏指针的操作
提高可移植性
子程序长度:50~150
子程序的参数
输入,修改,输出的顺序子程序的个数在7个之内
防御性编程
非法数据的破坏
外部数据值子程序输入参数值
如何处理错误
断言
assert用来捕捉的是程序员自己的错误。永远不应该发生的错误exception捕捉的是用户或者环境的错误。捕捉预期会发生的事情。
不要将需要执行的代码放入断言
健壮的代码:先使用断言处理错误,再使用错误处理
c语言的错误处理
<assert.h>检查输入参数的合理性
// crt_assert.c // compile with: /c #include <stdio.h> #include <assert.h> #include <string.h> void analyze_string( char *string ); // Prototype int main( void ) { char test1[] = "abc", *test2 = NULL, test3[] = ""; printf ( "Analyzing string '%s'\n", test1 ); fflush( stdout ); analyze_string( test1 ); printf ( "Analyzing string '%s'\n", test2 ); fflush( stdout ); analyze_string( test2 ); printf ( "Analyzing string '%s'\n", test3 ); fflush( stdout ); analyze_string( test3 ); } // Tests a string to see if it is NULL, // empty, or longer than 0 characters. void analyze_string( char * string ) { assert( string != NULL ); // Cannot be NULL assert( *string != '\0' ); // Cannot be empty assert( strlen( string ) > 2 ); // Length must exceed 2 } //输出 Analyzing string 'abc' Analyzing string '(null)' Assertion failed: string != NULL, file assert.cpp, line 25 abnormal program termination
*例子
void* memcpy(void *dst, const void *src, size_t count) { //安全检查 assert( (dst != NULL) && (src != NULL) ); unsigned char *pdst = (unsigned char *)dst; const unsigned char *psrc = (const unsigned char *)src; //防止内存重复 assert(!(psrc<=pdst && pdst<psrc+count)); assert(!(pdst<=psrc && psrc<pdst+count)); while(count--) { *pdst = *psrc; pdst++; psrc++; } return dst; }
error
库函数的调用错误assert的宏定义
c语言异常
C语言的异常机制 setjump longjump函数c++异常处理
相关文章推荐
- C语言指针 直接寻址与间接寻址详解
- C++中实现字符串函数split
- Problem G: C语言习题 医生值班
- C++ 学习之路(10):继承与派生
- C++ 将数据导入到CSV,txt文档中
- C++中的堆和栈的完全解析
- 蓝桥杯 2016c/c++A组 题解
- c++第2次作业
- C++ 链表
- superviseddescent (SDM C++11实现)环境配置
- C++第二次作业
- 结对项目— 词频统计(语言C++)
- C++ static静态成员变量和静态成员函数
- hash --C++
- C语言练习题
- kmp算法c++实现
- C语言中实现BOOL类型
- HDOJ 2024 C语言合法标识符
- c++犯过的错
- C++高层抽象之虚函数