必胜高考网_全国高考备考和志愿填报信息平台

必勝高考網 > 計算機類 > 計算機等級 > 資訊 >

計算機等級考試四級上機編程修養(中)

時間: 家輝2 資訊

  *

  * 文件名:network.c

  *

  * 文件描述:網絡通訊函數集

  *

  * 創建人: Hao Chen, 2003年2月3日

  *

  * 版本號:1.0

  *

  * 修改記錄:

  *

  *

  ************************************************************************/

  而對于函數來說,應該也有類似于這樣的注釋:

  /*================================================================

  *

  * 函 數 名:XXX

  *

  * 參 數:

  *

  * type name [IN] : descripts

  *

  * 功能描述:

  *

  * ..............

  *

  * 返 回 值:成功TRUE,失敗FALSE

  *

  * 拋出異常:

  *

  * 作 者:ChenHao 2003/4/2

  *

  *

  ================================================================*/

  這樣的描述可以讓人對一個函數,一個文件有一個總體的認識,對代碼的易讀性和易維護

  性有很大的好處。這是好的作品產生的開始。

  2、縮進、空格、換行、空行、對齊

  ————————————————

  i) 縮進應該是每個程序都會做的,只要學程序過程序就應該知道這個,但是我仍然看過不 縮進的程序,或是亂縮進的程序,如果你的公司還有寫程序不縮進的程序員,請毫不猶豫 的開除他吧,并以破壞源碼罪起訴他,還要他賠償讀過他程序的人的精神損失費。縮進, 這是不成文規矩,我再重提一下吧,一個縮進一般是一個TAB鍵或是4個空格。(最好用TAB 鍵)

  ii) 空格。空格能給程序代來什么損失嗎?沒有,有效的利用空格可以讓你的程序讀進來更加賞心悅目。而不一堆表達式擠在一起。看看下面的代碼:

  ha=(ha*128+*key++)%tabPtr->size;

  ha = ( ha * 128 + *key++ ) % tabPtr->size;

  有空格和沒有空格的感覺不一樣吧。一般來說,語句中要在各個操作符間加空格,函數調用時,要以各個參數間加空格。如下面這種加空格的和不加的:

  if ((hProc=OpenProcess(PROCESS_ALL_ACCESS,FALSE,pid))==NULL){

  }

  if ( ( hProc = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pid) ) == NULL ){

  }

  iii) 換行。不要把語句都寫在一行上,這樣很不好。如:

  for(i=0;i’9’)&&(a[i]<’a’||a[i]>’z’)) break;

  我拷,這種即無空格,又無換行的程序在寫什么啊?加上空格和換行吧。

  for ( i=0; i if ( ( a[i] < ’0’ || a[i] > ’9’ ) &&

  ( a[i] < ’a’ || a[i] > ’z’ ) ) {

  break;

  }

  }

  好多了吧?有時候,函數參數多的時候,最好也換行,如:

  CreateProcess(

  NULL,

  cmdbuf,

  NULL,

  NULL,

  bInhH,

  dwCrtFlags,

  envbuf,

  NULL,

  &siStartInfo,

  &prInfo

  );

  條件語句也應該在必要時換行:

  if ( ch >= ’0’ || ch <= ’9’ ||

  ch >= ’a’ || ch <= ’z’ ||

  ch >= ’A’ || ch <= ’Z’ )

  iv) 空行。不要不加空行,空行可以區分不同的程序塊,程序塊間,最好加上空行。如:

  HANDLE hProcess;

  PROCESS_T procInfo;

  /* open the process handle */

  if((hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pid)) == NULL)

  {

  return LSE_MISC_SYS;

  }

  memset(&procInfo, 0, sizeof(procInfo));

  procInfo.idProc = pid;

  procInfo.hdProc = hProcess;

  procInfo.misc |= MSC***A_PROC;

  return(0);

  v) 對齊。用TAB鍵對齊你的一些變量的聲明或注釋,一樣會讓你的程序好看一些。如:

  typedef struct _pt_man_t_ {

  int numProc; /* Number of processes */

  int maxProc; /* Max 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;

  怎么樣?感覺不錯吧。

  這里主要講述了如果寫出讓人賞心悅目的代碼,好看的代碼會讓人的心情愉快,讀起代碼也就不累,工整、整潔的程序代碼,通常更讓人歡迎,也更讓人稱道。現在的硬盤空間這么大,不要讓你的代碼擠在一起,這樣它們會抱怨你虐待它們的。好了,用“縮進、空格、換行、空行、對齊”裝飾你的代碼吧,讓他們從沒有秩序的土匪中變成一排排整齊有秩序的正規部隊吧。

  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返回的內存。請對這些系統調用返回的東西進行判斷。

55479 主站蜘蛛池模板: 步进驱动器「一体化」步进电机品牌厂家-一体式步进驱动 | 慢回弹测试仪-落球回弹测试仪-北京冠测精电仪器设备有限公司 | 影像测量仪_三坐标测量机_一键式二次元_全自动影像测量仪-广东妙机精密科技股份有限公司 | 净水器代理,净水器招商,净水器加盟-FineSky德国法兹全屋净水 | 成都装修公司-成都装修设计公司推荐-成都朗煜装饰公司 | 医用空气消毒机-医用管路消毒机-工作服消毒柜-成都三康王 | 万烁建筑设计院-建筑设计公司加盟,设计院加盟分公司,市政设计加盟 | 天津货架厂_穿梭车货架_重型仓储货架_阁楼货架定制-天津钢力仓储货架生产厂家_天津钢力智能仓储装备 | 胶辊硫化罐_胶鞋硫化罐_硫化罐厂家-山东鑫泰鑫智能装备有限公司 意大利Frascold/富士豪压缩机_富士豪半封闭压缩机_富士豪活塞压缩机_富士豪螺杆压缩机 | 工业胀紧套_万向节联轴器_链条-规格齐全-型号选购-非标订做-厂家批发价格-上海乙谛精密机械有限公司 | 卸料器-卸灰阀-卸料阀-瑞安市天蓝环保设备有限公司 | 石家庄救护车出租_重症转院_跨省跨境医疗转送_活动赛事医疗保障_康复出院_放弃治疗_腾康26年医疗护送转诊团队 | 微型气象仪_气象传感器_防爆气象传感器-天合传感器大全 | 环氧树脂地坪_防静电地坪漆_环氧地坪漆涂料厂家-地壹涂料地坪漆 环球电气之家-中国专业电气电子产品行业服务网站! | 卫生纸复卷机|抽纸机|卫生纸加工设备|做卫生纸机器|小型卫生纸加工需要什么设备|卫生纸机器设备多少钱一台|许昌恒源纸品机械有限公司 | 槽钢冲孔机,槽钢三面冲,带钢冲孔机-山东兴田阳光智能装备股份有限公司 | 济南保安公司加盟挂靠-亮剑国际安保服务集团总部-山东保安公司|济南保安培训学校 | 澳威全屋定制官网|极简衣柜十大品牌|衣柜加盟代理|全屋定制招商 百度爱采购运营研究社社群-店铺托管-爱采购代运营-良言多米网络公司 | 北京企业宣传片拍摄_公司宣传片制作-广告短视频制作_北京宣传片拍摄公司 | 济南货架定做_仓储货架生产厂_重型货架厂_仓库货架批发_济南启力仓储设备有限公司 | 重庆LED显示屏_显示屏安装公司_重庆LED显示屏批发-彩光科技公司 重庆钣金加工厂家首页-专业定做监控电视墙_操作台 | 冷水机,风冷冷水机,水冷冷水机,螺杆冷水机专业制造商-上海祝松机械有限公司 | 北京森语科技有限公司-模型制作专家-展览展示-沙盘模型设计制作-多媒体模型软硬件开发-三维地理信息交互沙盘 | 消泡剂-水处理消泡剂-涂料消泡剂-切削液消泡剂价格-东莞德丰消泡剂厂家 | 贝朗斯动力商城(BRCPOWER.COM) - 买叉车蓄电池上贝朗斯商城,价格更超值,品质有保障! | 杭州中央空调维修_冷却塔/新风机柜/热水器/锅炉除垢清洗_除垢剂_风机盘管_冷凝器清洗-杭州亿诺能源有限公司 | 智能案卷柜_卷宗柜_钥匙柜_文件流转柜_装备柜_浙江福源智能科技有限公司 | 重庆监控_电子围栏设备安装公司_门禁停车场管理系统-劲浪科技公司 | 巨野月嫂-家政公司-巨野县红墙安康母婴护理中心 | 123悬赏网_发布悬赏任务_广告任务平台| 冷油器-冷油器换管改造-连云港灵动列管式冷油器生产厂家 | 篷房[仓储-婚庆-展览-活动]生产厂家-江苏正德装配式帐篷有限公司 | 螺杆式冷水机-低温冷水机厂家-冷冻机-风冷式-水冷式冷水机-上海祝松机械有限公司 | 泰来华顿液氮罐,美国MVE液氮罐,自增压液氮罐,定制液氮生物容器,进口杜瓦瓶-上海京灿精密机械有限公司 | 美侍宠物-专注宠物狗及宠物猫训练|喂养|医疗|繁育|品种|价格 | 西宁装修_西宁装修公司-西宁业之峰装饰-青海业之峰墅级装饰设计公司【官网】 | 铝镁锰板厂家_进口钛锌板_铝镁锰波浪板_铝镁锰墙面板_铝镁锰屋面-杭州军晟金属建筑材料 | 上海律师事务所_上海刑事律师免费咨询平台-煊宏律师事务所 | 半自动预灌装机,卡式瓶灌装机,注射器灌装机,给药器灌装机,大输液灌装机,西林瓶灌装机-长沙一星制药机械有限公司 | 超细|超微气流粉碎机|气流磨|气流分级机|粉体改性机|磨粉机|粉碎设备-山东埃尔派粉体科技 | 农业仪器网 - 中国自动化农业仪器信息交流平台 |