2840|0

362

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

如何能编好单片机的程序(3) [复制链接]

v) 对齐。用TAB键对齐你的一些变量的声明或注释,一样会让你的程序好看一些。如:
typedef struct _pt_man_t_ {
  int   numProc;  /* Number of processes         */
  int   maxProc;  /* Max Number of processes       */
  int   numEvnt;  /* Number of events          */
  int   maxEvnt;  /* Max Number of events        */
  HANDLE* pHndEvnt;  /* Array of events           */
  DWORD  timeout;  /* Time out interval          */
  HANDLE hPipe;   /* Namedpipe              */
  TCHAR  usr[MAXUSR];/* User name of the process      */
  int   numMsg;   /* Number of Message          */
  int   Msg[MAXMSG];/* Space for intro process communicate */
} PT_MAN_T;
怎么样?感觉不错吧。
这里主要讲述了如果写出让人赏心悦目的代码,好看的代码会让人的心情愉快,读起代码也就不累,工整、整洁的程序代码,通常更让人欢迎,也更让人称道。现在的硬盘空间这么大,不要让你的代码挤在一起,这样它们会抱怨你虐待它们的。好了,用"缩进、空格、换行、空行、对齐"装饰你的代码吧,让他们从没有秩序的土匪中变成一排排整齐有秩序的正规部队吧。
         
3、程序注释
------
养成写程序注释的习惯,这是每个程序员所必须要做的工作。我看过那种几千行,却居然没有一行注释的程序。这就如同在公路上驾车却没有路标一样。用不了多久,连自己都不知道自己的意图了,还要花上几倍的时间才看明白,这种浪费别人和自己的时间的人,是最为可耻的人。
是的,你也许会说,你会写注释,真的吗?注释的书写也能看出一个程序员的功底。一般来说你需要至少写这些地方的注释:文件的注释、函数的注释、变量的注释、算法的注释、功能块的程序注释。主要就是记录你这段程序是干什么的?你的意图是什么?你这个变量是用来做什么的?等等。
不要以为注释好写,有一些算法是很难说或写出来的,只能意会,我承认有这种情况的时候,但你也要写出来,正好可以训练一下自己的表达能力。而表达能力正是那种闷头搞技术的技术人员最缺的,你有再高的技术,如果你表达能力不行,你的技术将不能得到充分的发挥。因为,这是一个团队的时代。
好了,说几个注释的技术细节:
i) 对于行注释("//")比块注释("/* */")要好的说法,我并不是很同意。因为一些老版本的C编译器并不支持行注释,所以为了你的程序的移植性,请你还是尽量使用块注释。
ii) 你也许会为块注释的不能嵌套而不爽,那么你可以用预编译来完成这个功能。使用"#if 0""#endif"括起来的代码,将不被编译,而且还可以嵌套。
4、函数的[in][out]参数
-----------
我经常看到这样的程序:
FuncName(char* str)
{
  int len = strlen(str);
  .....
}
char*
GetUserName(struct user* pUser)
{
  return pUser->name;
}
不!请不要这样做。
你应该先判断一下传进来的那个指针是不是为空。如果传进来的指针为空的话,那么,你的一个大的系统就会因为这一个小的函数而崩溃。一种更好的技术是使用断言(assert),这里我就不多说这些技术细节了。当然,如果是在C++中,引用要比指针好得多,但你也需要对各个参数进行检查。
写有参数的函数时,首要工作,就是要对传进来的所有参数进行合法性检查。而对于传出的参数也应该进行检查,这个动作当然应该在函数的外部,也就是说,调用完一个函数后,应该对其传出的值进行检查。
当然,检查会浪费一点时间,但为了整个系统不至于出现"非法操作"或是"Core Dump"的系统级的错误,多花这点时间还是很值得的。
5、对系统调用的返回进行判断
--------------
继续上一条,对于一些系统调用,比如打开文件,我经常看到,许多程序员对fopen返回的指针不做任何判断,就直接使用了。然后发现文件的内容怎么也读出不,或是怎么也写不进去。还是判断一下吧:
  fp = fopen("log.txt", "a");
  if ( fp == NULL ){
    printf("Error: open file error\n");
    return FALSE;
  }
其它还有许多啦,比如:socket返回的socket号,malloc返回的内存。请对这些系统调用返回的东西进行判断。
6if 语句对出错的处理
-----------
我看见你说了,这有什么好说的。还是先看一段程序代码吧。
  if ( ch >= '0' && ch <= '9' ){
    /* 正常处理代码 */
  }else{
    /* 输出错误信息 */
    printf("error ......\n");
    return ( FALSE );
  }
这种结构很不好,特别是如果"正常处理代码"很长时,对于这种情况,最好不要用else。先判断错误,如:
  if ( ch < '0' || ch > '9' ){
    /* 输出错误信息 */
    printf("error ......\n");
    return ( FALSE );
  }
  
  /* 正常处理代码 */
  ......
这样的结构,不是很清楚吗?突出了错误的条件,让别人在使用你的函数的时候,第一眼就能看到不合法的条件,于是就会更下意识的避免。
此帖出自单片机论坛
点赞 关注
 

回复
举报
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/8 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表