您的位置 首页 厂商

【单片机到嵌入式之路】序列之5:你的代码他人有耐性看么?

本节我们将从代码格式来审视你的代码,主要是从下面3个方面进行讲解:1.代码格式的重要性2.规范自己的代码格式3.函数设计和变量定义格式一、代码格式的重要性:

  本节咱们将从代码格局来审视你的代码,首要是从下面3个方面进行解说:

  1.代码格局的重要性

  2.标准自己的代码格局

  3.函数规划和变量界说格局

  一、代码格局的重要性:

  好的代码格局犹如男工程师看见美人,女工程师看见帅哥相同,有种一见钟情的感觉。但是事实上许多人不重视代码的标准性,成果写出来的代码,没有连自己都不想看第二遍,这是工程师的大忌。

  不论是硬件工程师仍是软件工程师,杰出的代码格局是基本功。假如你写的代码他人就看了几行就感觉厌恶、吐逆,你说你的代码他人还有耐性悉数看完么?

  曾经看见一个研究生,认为自己多牛逼,写的代码没有一行注释了。变量取名也是不可思议的,成果有一个bug。导致他查看了半个月。何须这样害自己呢?不要认为你写的代码多高档,不要加注释,不重视格局,怕他人仿制。他人想仿制你的代码,阐明你的代码有价值。

  好了不多少了,直接进入下一个小点吧。O(∩_∩)O~

 

  二、标准自己的代码格局

  1.文件结构

  a) 版权和版别的声明

  这个是每个公司或许个人为了保护自己的代码而写的。格局也不是固定了,首要依据个人的喜好来写的。下面贴出自己喜爱的格局。

  /*

  * Copyright (c) 2014, 鑫亮电子

  * All rights reserved.

  * 文件名称:usart.c

  * 摘 要:串口驱动函数

  * 硬件渠道:STM32F030探究套件

  * 当时版别:V0.0

  * 完结日期:2013-01-09

  * 修正记载:

  */

  很简略,仅仅作为参阅吧。

  b) 头文件的结构

  头文件由三部分内容组成:

  (1)头文件最初处的版权和版别声明。

  (2)预处理块。

  (3)函数和类结构声明等。

  下面首要看头文件的类型,以个人平常的程序为例:

  /* Includes —————————-*/

  #ifndef __EXTI_H //避免重界说

  #define __EXTI_H

  //个人喜好

  #include "STM32F0xx.h" //包含的头文件

  void EXTI_KEY_Init(void); //外部间断初始化

  //个人喜好

  #endif

  c) 界说文件的结构

  界说文件有三部分内容:

  (1) 界说文件最初处的版权和版别声明。

  (2) 对一些头文件的引证。

  (3) 程序的完成体(包含数据和代码)。

  下面以常见的比如为例:

  // 大局函数的完成体

  void Function1(…)

  {

  …

  }

  2.程序的板式

  为了更好的解说程序的版式,下面以一个比如为例来解说:

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

  * 函数描绘:外部间断0服务程序

  * 输入参数:No

  * 返 回 值:No

  * 说 明:无

  * 修正记载:无

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

  void EXTI0_1_IRQHandler(void)

  {

  if(EXTI_GetITStatus(EXTI_Line0) != RESET)//判别线0上的间断是否产生,能够了解为标志位

  {

  /* Toggle LED3 and LED4 */

  GPIO_WriteBit(GPIOC,GPIO_Pin_8,

  (BitAction)((1-GPIO_ReadOutputDataBit(GPIOC, GPIO_Pin_8))));

  GPIO_WriteBit(GPIOC, GPIO_Pin_9,

  (BitAction)((1-GPIO_ReadOutputDataBit(GPIOC, GPIO_Pin_9))));

  /* Clear the EXTI line 0 pending bit */

  EXTI_ClearITPendingBit(EXTI_Line0);//铲除LINE0上的间断标志位

  }

  }

  A.注释办法有有两种【//】 和 【/* */】.

  B.对齐办法要留意。

  C.函数的规划也很重要。

  D.变量的界说也很要害。

  E.拆行也很重要,要害在其可读性。

  F.必要的注释能够让读者了解的更快,对自己今后保护更快捷。

  三、变量的界说和函数的规划

  1.变量的界说

  a) 见名知意

  int width; //界说宽度

  #define MAX 100; /* 最大值为100*/

  等等,上面也是两种注释办法。

  游客,假如您要查看本帖躲藏内容请回复

  2.函数的规划

  函数的规划其实很要害,对读者适当重要。一个好的函数规划能够让读者看出规划者独出机杼。下面简略举几个比如来阐明:

  void Object::SetValue(int width, int height)

  {

  m_width = width;

  m_height = height;

  }

  下面再叙述一下断语的运用:

  程序一般分为Debug版别和Release版别,Debug版别用于内部调试,Release版别发行给用户运用。

  断语assert是仅在Debug版别起效果的宏,它用于查看“不应该”产生的状况。下面比如是一个内存仿制函数。在运转过程中,假如assert的参数为假,那么程序就会间断(一般地还会呈现提示对话,阐明在什么地方引发了assert)。

  void *memcpy(void *pvTo, const void *pvFrom, size_t size)

  {

  assert((pvTo != NULL) && (pvFrom != NULL)); // 运用断语

  byte *pbTo = (byte *) pvTo; // 避免改动pvTo的地址

  byte *pbFrom = (byte *) pvFrom; // 避免改动pvFrom的地址

  while(size — > 0 )

  *pbTo ++ = *pbFrom ++ ;

  return pvTo;

  }

  assert不是一个匆促凑集起来的宏。为了不在程序的Debug版别和Release版别引起不同,assert不应该产生任何副效果。所以assert不是函数,而是宏。程序员能够把assert当作一个在任何体系状态下都能够安全运用的无害测验手法。假如程序在assert处停止了,并不是说含有该assert的函数有过错,而是调用者出了过失,assert能够协助咱们找到产生过错的原因。

  很少有比盯梢到程序的断语,却不知道该断语的效果更让人懊丧的事了。你化了许多时刻,不是为了扫除过错,而仅仅为了弄清楚这个过错究竟是什么。有的时分,程序员偶然还会规划出有过错的断语。所以假如搞不清楚断语查看的是什么,就很难判别过错是呈现在程序中,仍是呈现在断语中。走运的是这个问题很好处理,只需加上明晰的注释即可。这本是清楚明了的工作,但是很少有程序员这样做。这比如一个人在森林里,看到树上钉着一块“风险”的大牌子。但风险究竟是什么?树要倒?有废井?有野兽?除非告知人们“风险”是什么,不然这个警告牌难以起到活跃有用的效果。难以了解的断语常常被程序员疏忽,乃至被删去。

  【留意】:

  A.运用断语捕捉不应该产生的不合法状况。不要混杂不合法状况与过错状况之间的差异,后者是必定存在的而且是一定要作出处理的。

  B.在函数的入口处,运用断语查看参数的有用性(合法性)。

  C.在编写函数时,要进行重复的考察,而且自问:“我打当作哪些假定?”一旦确认了的假定,就要运用断语对假定进行查看。

  D.一般教科书都鼓舞程序员们进行防错规划,但要记住这种编程风格可能会隐秘过错。当进行防错规划时,假如“不可能产生”的工作确实产生了,则要运用断语进行报警。

  以上内容参阅了林锐博士的【C/C++ 代码标准参阅】一书。

  关于代码对齐 和 一些其它的内容,我期望我们能够多阅览他人的代码,多操练,只要多操练了才干把握于心,才干游刃有余。

  以上的内容我们能够作为参阅,就作为抛砖引玉吧,期望我们能提出更好的办法,共同提高才是王道!!!

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/changshang/116442.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部