读《微软C编程精粹》的一些收获
- 要使用断言对函数参数进行确认
- 为了不必要的开销,可以仅使用断言,而不要return
网上有人写的strcpy代码,做了太多的出错处理,导致性能低下,其实没必要,用assert就行了,这样在debug模式下能捕捉错误,release下又不影响性能。
- 书上提供的memcpy的范例
void memcpy(void* pvTo, void* pvfrom, size_t size)
{
void* pbTo = (byte*)pvTo;
void* pbfrom = (byte*)pvfrom;
ASSERT(pvTo != NULL && pvfrom != NULL);
/* 内存块重叠吗?如果重叠,就使用memmove */
ASSERT(pbTo>=pbfrom+size || pbfrom>=pbTo+size);
while(size-->0)
*pbTo++ == *pbfrom++;
return(pvTo);
}
- 不使用ASSERT的危害
这个小组的代码与Word代码之间一个明显的区别是Word代码从过去到现在一直都使用断言和调试代码,而他们的代码却几乎没有使用断言。因此,其程序员没有什么好的办法可以确定其代码中的实际错误情况,错误只能慢慢地暴露出来。如果他们在代码中使用了断言,这些错误本该在几个月之前就被检查出来。
同样,xeyez由于没有使用Debug版,导致了很多的内存错误在客户的电脑上暴漏了出来。
- 一个错误的使用ASSERT的例子
char* strdup(char* str)
{
char* strNew;
ASSERT(str != NULL);
strNew = (char*)malloc(strlen(str)+1);
ASSERT(strNew != NULL); // 这里使用错误
strcpy(strNew, str);
return(strNew);
}
第一个断言的用法是正确的,因为它被用来检查在该程序正常工作时绝不应该发生的非法情况。第二个断言的用法相当不同,它所测试的是错误情况,是在其最终产品中肯定会出现并且必须对其进行处理的错误情况。
虽然这一程序更精确地反应了相应的算法,但有经验的程序员很少会这样编码。否则好机会就来了,我们可以把他们塞进一辆既没有安全带又没有车门的双人Cessna车中。上面的程序使人感到太危险了。
在该函数的交付版本中,相应的防错措施可以保证当出了毛病时,用户可以不受损失;而在该函数的调试版本中,错误仍然可以被报告出来。
相关文档:
2009-09-13 16:42:43
今天实现堆栈结构部分的代码,并用一简单程序测试成功。
stack.h:
#ifndef _STACK_H_
#define _STACK_H_
#include <stdio.h>
#include <stdlib.h>
#include <memory.h>
#define STACK_INIT_SIZE 5
#define STACKINCREMENT 5
t ......
最近一个朋友准备把C代码在ECLIPSE上编译,以前一直搞的JAVA,也知道ECLIPSE支持C工程,但是自己从来没搞过,所以就自己先从网络上找资料,主要方法如下
1、安装JDK和Eclipse
这里就不多说,具体请见:http://blog.chinaunix.net/u/16292/showart_223309.html
我的安装环境是jdk1.5,eclipse3.2.1
2、安装C++的E ......
http://blog.csdn.net/eroswang/archive/2009/06/12/4265046.aspx
1,防止一个头文件被重复包含
#ifndef COMDEF_H
#define COMDEF_H
//头文件内容
#endif
2,重新定义一些类型,防止由于各种平台和编译器的不同,而产生的类型字节数差异,方便移植。
typedef unsigned char boolea ......
1,防止一个头文件被重复包含
#ifndef COMDEF_H
#define COMDEF_H
//头文件内容
#endif
2,重新定义一些类型,防止由于各种平台和编译器的不同,而产生的类型字节数差异,方便移植。
typedef unsigned char boolean; /* Boolean value type. */
typedef ......