• [转]WINCE的编程忠告


    //========================================================================
    //TITLE:
    //    WINCE的编程忠告
    //AUTHOR:
    //    norains
    //DATE:
    //    第一版:Wednesday 7-March -2007
    //    修正版:Tuesday 7-October-2007
    // 
    //========================================================================

    1.尽量采用SDK!
      
      我不是那种偏执狂,全盘否定MFC,我也不是不知道MFC编写代码的便利,但我更知道,WINCE下的MFC,必须依赖于Explorer存在--恩,至少在WinCE 4.2下的确是如此.WinCE6.0呢?噢,对不起,我没试过,不知道.
      
      WinCE 的可定制性,无法确保每一个OEM厂商一定采用Explore,也许他们会觉得Explorer太大了,又或许他们觉得自己写的shell更漂亮,但不管 怎么说,Explorer是在他们的机器上小时了.如果你能想让你的程序能够在他们乃至大部分机器上耀武扬威,那么,请直接采用SDK书写代码吧!
      
      
      
    2.不要在代码中出现奇怪的数字!
      
      奇怪的是数字?噢?什么是奇怪的数?
      
      我们来看看有段代码:
      
      TCHAR szFileRead[200] = {0};
      ...
      TCHAR szFileWrite[200] = {0};
      
      恩,现在看起来似乎没什么问题.但我们不妨考虑一下,时间这么一天天过去,很久很久以后,我们突然发现,szFileRead的200空间不够用了,需要扩充成300乃至更多.好吧,那我们就改吧:  
      
      TCHAR szFileRead[300] = {0};
      
       噢,等等,为什么szFileWrite也是200,这个200和之前的szFileRead有没有联系?是否改了szFileRead也需要顺道更改 szFileWrite?我的天,这是很久很久以前的事情,我怎么会知道呢?如果有文档记录,翻翻找找,也许尚存一线蛛丝马迹;如果没有呢,那我是不是已 经点燃了一个定时炸弹?
      
      与其如此的担惊受怕,我们何必一开始不这么做呢?
      
      #define BUFFER_LENGTH  200
      TCHAR szFileRead[BUFFER_LENGTH] = {0};
      ...
      TCHAR szFileWrite[BUFFER_LENGTH] = {0};
      
      恩,这下子我们知道szFileRead和szFileWrite有那么紧密的联系了.即使以后修改,我们也不用每个每个逐字修正,只要更改BUFFER_LENGTH的定义就可以,这不是非常轻松愉快?
      
      
      
    3.字符串?用宏定义的!

      回想一下,如果我们给某个窗口设置标题,是不是会这样:
      
      SetWindowText(hWnd,L"New_Wnd");
      
       是的,没错,这段代码在WinCE下运行得非常完美.但突然有那么一天,你的BOSS心血来潮,让你将该程序一直到WinXP,或是突然你觉得这段代码非 常有用,想在WinXP下也秀一把,于是你无非这么做:复制 -> 黏贴 ->编译! Oh,我的上帝!瞧瞧,发现了什么?编译器无法通过!因为在VC6.0下,SetWindowText()的字符不能是宽字符!也就是说,代码应该换成这 个模样:
      
      SetWindowText(hWnd,"New_Wnd");
      
      修正一下,终于顺利编译通过.好的,如果你的代码中只有一处,似乎更改一下并没有什么琐屑和烦恼,但想象一下,如果你定义了很多字符串操作:
      
      wchar_t szName[] = L"你好";
      wchar_t szNameAgain[sizeof(szName)];
      wcscpy(szNameAgain,szName);
      
      如果要把这段代码一直到WinXP,需要将wchar_t换成char,wcscpy置换为strcpy.啊,是不是非常烦琐?!万一更恐怖些,这种代码有上千行,那岂不是需要更改得头晕眼花?
      
      当然了,如果不想这么复杂,微软也给我们安排好了后路:
      
      TCHAR szName[] = TEXT("你好");
      TCHAR szNameAgain[sizeof(szName)];
      _tcscpy(szNameAgain,szName);
      
      这段代码无论在EVC或是VC6.0,编译器都会给你一个非常愉快的感受:EVC下TCHAR会自动转换为UNICODE字符,而VC下则不会.
      
      你能确保你的代码永远只能在WinCE下运行么?如果不能,当涉及到字符串的操作的时候,请使用微软为我们安排好的套餐吧!
      
      当然,这也有例外,如果你明确知道所使用的字符串无论在WinCE或是WinXP都是同样的类型,那么,请大胆的使用该类型吧.
      
       比如,最典型的例子,RS-232操作的某些蓝牙通信模块,它发回来的数据永远是ASCII码.如果此时,你是定义TCHAR来接收,在WinXP下工作 得非常舒服,但WinCE下可能就会让你脑袋崩溃(原因请见之前的一句话)!这时候,你也只有唯一的选择,接收缓冲区毫不犹豫定义为:char!


    转载地址:
    http://blog.csdn.net/norains/archive/2007/03/07/1523714.aspx

  • 相关阅读:
    headfirst设计模式(6)—单例模式
    headfirst设计模式(5)—工厂模式体系分析及抽象工厂模式
    headfirst设计模式(4)—工厂模式
    headfirst设计模式(3)—装饰者模式
    headfirst设计模式(2)—观察者模式
    headfirst设计模式(1)—策略模式
    BeanFactory 与 FactoryBean
    两个List集合取交集、并集、差集
    服务编排
    oracle报错ORA-01843: not a valid month
  • 原文地址:https://www.cnblogs.com/answer/p/990877.html
Copyright © 2020-2023  润新知