*. 线程函数并不使用普通的函数堆栈,而是使用线程自己的堆栈。线程堆栈是线程在每次启动时动态分配的,这样就可以在线程函数每次执行时使用不同的堆栈,从而避免线程函数执行流重叠时可能出现的堆栈破坏。如果一个函数可能会被多个线程调用的话,对于它们共享的数据要进行同步访问保护,并且避免使用static局部变量。
*. float GetValue ( void ) ; 良好风格 float GetValue ( ); 不良好的风格 int abc( int width,int height) ;好风格 int abc( int , int ) 不良好的风格
*. const & . 效率且不可变。 你都快忘记了,c++中我们应该尽量使用 & .
*******************
*.不要将正常值和错误标志混在一起返回,建议正常值用输出参数获得,而错误标志用return 语句返回。错误一般定义为负数。
*. 根据经验,要提高函数的质量,我们可以在函数体的“入口处“ 和“出口处“从严把关,从而提高函数质量。
入口处:对参数进行有效性的检查。全局变量,文件句柄等都是有必要的检查。
出口处:对返回值和错误处理要清楚。 尽量避免使用带有记忆功能的函数,比如:全局变量,static变量,等等。
*******************
使用断言:assert ( expression ) ;
1. 断言失败,表示程序存在一个bug, assert ( expression ) ; assert() 只在bug版里面有。因为程序分为debug 和 release版本,assert被宏定义#ifdef+DEBUG #endif包含。so .
assert处终止,有错误。调用函数出了差错。他可以帮助我们追踪到错误。****
2. 程序员可以把assert看成一个在任何系统状态下都可以安全使用的无害测试手段,
3.建议:在入口处,建议使用断言来检查参数的有效性。 assert( (pvTo != NULL ) & (pvFrom != NULL) );
***使用断言的目的:是捕捉在运行时不应该发生的非法情况。不要混淆非法情况与错误情况之间的区别,后者是程序运行过程中自然存在的并且是一定要主动做出处理的。
比如:malloc申请失败,属于错误情况,应该使用if,而不是非法情况,不应该使用assert... 非法:即不可能发生的事情发生了,就要报警。
************* use const whenever you need .. 建议:使用const频繁一点。 const 修饰的返回值不能够被修改哦。
--------------------------------------
1.当我们不再使用某一个宏时,可以使用#undef来取消其定义。例如#undef TEXT 否则简单地删除宏定义会带来许多编译错误。
2.初始化是:创建的同时使用初值直接填充对象的内存单元。
page 26
\