欢迎来到天天文库
浏览记录
ID:24234997
大小:53.50 KB
页数:4页
时间:2018-11-13
《microsoft windows ce 编程的十点忠告》由会员上传分享,免费在线阅读,更多相关内容在学术论文-天天文库。
1、MicrosoftWindowsCE编程的十点忠告 最近两周我们花了大部分时间将已有的应用程序移植到MicrosoftAXFILELEN);if(pszFileName)strncpy(pszFileName,p,MAXFILELEN);/*etc*/ 在这段代码中,分配的内存块应该写作(MAXFILELEN*sizeof(char)),但是大多数程序员喜欢将它简化为MAXFILELEN,因为对于所有的平台来说sizeof(char)的值等于1。然而,当你用TCHARS代替多个字符时,很容易忘记这种固有的概念,于是
2、将代码编写成下面的形式:intmyfunc(TCHAR*p){TCHAR*pszFileName;PszFileName=(TCHAR*)malloc(MAXFILELEN);If(pszFileName)tcsncpy(pszFileName,p,MAXFILELEN);/*etc*/ 这是不行的。它马上会导致出错。这里的错误在于malloc函数中指定变量大小为bytes,然而_tcsncpy函数中使用的第三个变量却指定为TCHARs而不是bytes。当UNICODE被定义时,一个TCHAR等于两个字节数(byte
3、s)。 上述代码段应该改写为:intmyfunc(TCHAR*p){TCHAR*pszFileName;PszFileName=(TCHAR*)malloc(MAXFILELEN*sizeof(TCHAR));if(pszFileName)tcsncpy(pszFileName,p,MAXFILELEN);/*etc*/ 3.不要将Unicode字符串放入奇数内存地址 在Intel系列处理器上,你可以在一奇数内存地址储存任何变量或数组,不会导致任何致命的错误影响。但在H/PC上,这一点不一定能行?你必须对大于一个
4、字节的数据类型小心谨慎,包括定义为无符号短型(unsignedshort)的wchar_t。当你设法访问它们的时候,将它们置于奇地址会导致溢出。 编辑器经常在这些问题上提醒你。你无法管理堆栈变量地址,并且编辑器会检查确定这些地址与变量类型是否相匹配。同样,运行时间库必须123下一页——感谢阅读这篇文章,..,保证从堆中分配的内存总是满足一个emcpy()函数拷贝内存区域的代码,或者使用了某种类型的指针算术以确定内存地址,问题也许就出现了。考虑下面的例子:intsend_name(TCHAR*pszName){char
5、*p,*q;intnLen=(_tcslen(pszName)+1)*sizeof(TCHAR);p=maloc(HEADER_SIZE+nLen);if(p){q=p+HEADER_SIZE;_tcscpy((TCHAR*)q,pszName);}/*etc*/ 这段代码是从堆中分配内存并复制一个字符串,在字符串的开头留一个HEADER_SIZE的大小。假设UNICODE定义了,那么该字符串就是一个emcpy()复制字符串。因此,采用逐个字节分析Unicode字符串的函数也许足以确定字符串在ANSItoustinc
6、ludenullterminator,asinMultiByteToultiByte()*/for(pA=strA,pW=st上一页123下一页——感谢阅读这篇文章,..,ralloc()函数可以代替calloc()函数。并且不要忘记,calloc()函数初始化时分配的内存为零,而malloc()函数不一样。同样,time()函数也不能使用,但你可以使用Time()函数代替time()函数。 经过以上的警告后,你会高兴地学习最后令你惊讶的两点忠告。 9.不需要改变Win32输入/输出(I/O)文件的调用 Win3
7、2的输入输出函数,Windoa数据库管理器在数据库文件中以二进制形式保存数字数据。这就意味一个记录无论何时写入数据库或从数据库读出,均被当作一系列的字节来处理,不管它域的内容。只要数据库文件不要传给别的任何系统,数字数据的字节状态问题就解决了。如果数据库文件被一个来自原始系统且带有不同字节状态的处理器访问,数字数据将被误解。 无论何时,当你在拥有不同处理器的机器上传输文件时,就会出现这个问题。在这个问题上,值得高兴的是所有类型的处理器都使用相同的字节状态。 在使用WindowsCE时,这10点忠告应该引起你足够的重
8、视,避免学习时走弯路。上一页123——感谢阅读这篇文章,..,
此文档下载收益归作者所有