0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

整理总结一份属于自己的编码风格

Q4MP_gh_c472c21 来源:未知 作者:李倩 2018-03-23 11:48 次阅读

看到别人的编写的代码规范非常羡慕,于是也整理总结一份属于自己的编码风格,用于规范自己的代码,增强可读性,非标准规范。强制自己形成良好的编码风格,有利于开发大规模程序而不显得杂乱。 参考STM32固件库编码风格和FreeRTOS编码风格。

一、工程文件组织结构

新建工程文件应包含以下全部或部分文件夹:

·usrSrc:用户源文件,用来存放.c文件和其他的源文件。main.c应放在这里。

·usrInc:用户头文件,用来存放.h文件。

·usrDoc:用户说明文档,用来存放用户在开发过程中书写的文档,一般为.txt格式。例如Readme.txt,指令说明等。

·Src:引用库的源文件。

·Inc:应用库的头文件。

·Lib:引用的库文件。一个工程一定要包含一个main.c文件,只用来存放main函数。其余函数的定义应在相应的.c文件中,声明在相应的.h文件中。

源文件

·文件头,文件的简介

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

* Copyright (c) 2017, Jimbo Zhang

* All rights reserved.

*

* File name : USB_Ctrl.c

* Brief : USB API source code.

* Introduce the main function or content of this document briefly.

* Revision : 1.01

* Author : Jimbo Zhang

* Date : 2017.03.10

* Update : Introduce the difference from previous version.*************************************************************************/

·必要的注释和说明源文件应该只包含它自己的头文件,其他的头文件在他自己的头文件中包含。源文件中只声明局部函数,全局函数在头文件中声明。全局变量在相应的源文件中定义,在头文件中用extern声明。类型定义在头文件中定义。

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

/*only include it's own header file, theothers header fileincluded byUSB_Ctrl.h*/#include "USB_Ctrl.h"

/* Declaration --------------------------------------------------------*/

/*here are thelocalfunction declare, globalfuction declare inheader file.*/

void delay( uint32_t n);

/* Global variable ----------------------------------------------------*/

·函数头

/******************************************************* Brief : Delay n ms* Parameter : * n: the number of delay microsecond.* Return : None.*******************************************************/

void delay( uint32_t n)

{for( i=0; i<110; i++)        ;

}

头文件

·文件头,文件的简介

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

- Copyright (c) 2017, Jimbo Zhang

- All rights reserved.

-

- File name : USB_Ctrl.h

- Brief : The header file of USB_Ctrl.c.

- Revision : 1.01

- Author : Jimbo Zhang

- Date : 2017.03.10

- Update : Introduce the difference from previous version.*************************************************************************/

·必要的注释和声明

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

/* Define -------------------------------------------------------------*/

/* Typedef ------------------------------------------------------------*/typedefunsignedintapiStatus; //api return code

/* Enume --------------------------------------------------------------*/

/* Extern -------------------------------------------------------------*/

/* Declaration --------------------------------------------------------*/

命名规则

参考FreeRTOS命名规则,MISRA C规范。- 定义变量时尽量使用uint8_t 、uint16_t 、uint32_t等。头文件为stdint.h。

typedefsignedcharint8_t;typedefshortint16_t;typedefintint32_t;typedeflonglongint64_t;typedefunsignedcharuint8_t;typedefunsignedshortuint16_t;typedefunsignedintuint32_t;typedefunsignedlonglonguint64_t;

·uint32_t类型的变量使用前缀ul,这里’u’表示’unsigned’,’l’表示’long’

·uint16_t类型的变量使用前缀us,这里’u’表示’unsigned’,’s’表示’short’

·uint8_t类型的变量使用前缀uc,这里’u’表示’unsigned’,’c’表示’char’

·枚举类型变量使用前缀e

·指针类型变量在类型基础上附加前缀p,比如指向uint16_t的指针变量前缀为pus

·与MISRA指南一致,char类型变量仅被允许保存ASCII字符,前缀为c

·与MISRA指南一致,char *类型变量仅允许指向ASCII字符串,前缀为pc

·宏定义全部使用大写,两个单词之间用下划线隔开。

·具有文件作用域的对象尽量声名为static的。

·全局变量加前缀’g_’。整个工程都可以用的变量,不局限于文件作用域。

代码风格

·缩进:缩进使用制表符,一个制表符等于4个空格。

·注释:注释单行不超过80列,特殊情况除外。

·布局:源代码应被设计成尽可能的易于查看和阅读。

下面的代码片中,第一部分展示文件布局,第二部分展示C代码设计格式。

/* #defines, 在合理的位置添加括号. */#define A_DEFINITION ( 1 )

/*

* 随后是Static (文件内部的)函数原型,

* 如果注释有多行,参照本条注释风格---每一行都以’*’起始.

*/staticvoidprvAFunction( uint32_t ulParameter );

/* 文件作用域变量(本文件内部使用),要在函数体定义之前. */staticBaseType_t xMyVariable.

/* 每一个函数的结束都有一行破折号,破折号与下面的第一个函数之间留一行空白。*/

/*-----------------------------------------------------------*/

voidvAFunction( void)

{

/* 函数体在此定义,注意要用大括号括住 */

} /*-----------------------------------------------------------*/

staticUBaseType_t prvNextFunction( void)

{

/* 函数体在此定义. */

} /*-----------------------------------------------------------*/

/*

* 函数名字总是占一行,包括返回类型。 左括号之前没有空格左括号之后有一个空格,

* 每个参数后面有一个空格,参数的命名应该具有一定的描述性.

*/voidvAnExampleFunction( longlParameter1, unsignedshortusParameter2 )

{ /* 变量声明没有缩进. */

uint8_t ucByte;

/* 代码要对齐. 大括号占独自一行. */

for( ucByte = 0U; ucByte < fileBUFFER_LENGTH; ucByte++ )    

{

/* 这里再次缩进. */

}

}

/*

* for、while、do、if结构具有相似的模式。这些关键字和左括号之间没有空格。

* 左括号之后有一个空格,右括号前面也有一个空格,每个分号后面有一个空格。

* 每个运算符的前后各一个空格。使用圆括号明确运算符的优先级。不允许有0

* 以外的数字(魔鬼数)出现,必要时将这些数字换成能表示出数字含义的常量或

* 宏定义。

*/for( ucByte = 0U; ucByte < fileBUFFER_LENGTH; ucByte++ )    

{

}

while( ucByte < fileBUFFER_LENGTH )    

{

}

/*

* 由于运算符优先级的复杂性,我们不能相信自己对运算符优先级时刻保持警惕

* 并能正确的使用,因此对于多个表达式运算时,使用括号明确优先级顺序

*/if( ( ucByte < fileBUFFER_LENGTH ) && ( ucByte != 0U ) )    

{

ulResult = ( ( ulValue1 + ulValue2 ) - ulValue3 ) * ulValue4;

}

/* 条件表达式也要像其它代码那样对齐。 */#if( configUSE_TRACE_FACILITY == 1 )

{

/* 向TCB增加一个用于跟踪的计数器. */

pxNewTCB->uxTCBNumber = uxTaskNumber;

} #endif

/*方括号前后各留一个空格*/

ucBuffer[ 0] = 0U;

ucBuffer[ fileBUFFER_LENGTH - 1U] = 0U;

编程思想

·将特定功能的代码封装成函数。

C语言编程规则

参考MISRA

·Rule1:不得使用三元操作符(? : )。

·Rule2:不得残留被注释掉的废代码。

·Rule3:所有标识符不超过31字符。

·

Rule4:不同名空间中的变量名不得相同。例如:typedef struct MyStruct {... } MyStruct; (违规)

·

struct Person {

char* name;

...

};

char name[32]; (违规)

·Rule5: 不得使用char, int, float, double, long等基本类型,应该用stdint.h中定义的类型显示表示类型的大小,如uint16_t、int32_t等。

·Rule6:禁止使用八进制数。(因为086U这样的常数很容易引起误解)。

·Rule7:不得定义与外部作用域中某个标识符同名的对象,以避免遮盖外部作用域中的标识符。

·Rule8:具有文件作用域的对象尽量声名为static的。

·Rule9:自动对象(栈对象)使用前必须赋初值。

·

Rule10:操作符&&和||的右侧表达式不得具有副作用(side-effect)。也就是说,象 if (x == 20 && ++y == 19)这样的表达式被禁止。

·

·

Rule11:不得对有符号数施加位操作,例如 1 << 4 将被禁止,必须写 1UL << 4。

·

·Rule12:不得对有副作用的表达式施加sizeof操作符。

·Rule13: 除了循环控制语句,不得使用逗号表达式。

·Rule14:不得显式判断浮点数的相等性和不等性。

·Rule15:不得遗留“永远不会用到”的代码。

·Rule16:除了switch语句,不得使用标号(label)。

·Rule17:不得使用goto。

·Rule18:不得使用continue。

·Rule19:除了switch语句,不得使用break

·Rule20:if, else if, else, while, do..while, for语句块必须使用{}括起。

·Rule21:循环计数器的值不得在循环体内修改。

·Rule22:禁止任何直接和间接的递归函数调用。

·Rule23:不应该使用#undef。

·Rule24:不得将宏作为参数传给宏函数。

·Rule25:在一个宏定义中,#或##符号只能出现一次。

·Rule26:禁止指针运算(代之以数组下标运算)。

·Rule27:禁止超过两级的指针。

·Rule28:禁止使用指向函数的非常量指针。

·Rule29:禁止使用setjmp, longjmp。

·Rule30:禁止使用atoi, atof, atol。(这个我很赞成,建议使用strtol, strtod等函数)

·Rule31:禁止使用abort, exit, getenv。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 嵌入式
    +关注

    关注

    5065

    文章

    18998

    浏览量

    302658
  • C语言
    +关注

    关注

    180

    文章

    7597

    浏览量

    136060
  • 编码
    +关注

    关注

    6

    文章

    934

    浏览量

    54747

原文标题:嵌入式er日常!强制自己形成良好的编码风格

文章出处:【微信号:gh_c472c2199c88,微信公众号:嵌入式微处理器】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    一份CS32L010F8U6的电机编码器捕获的代码

    使用CS32L010F8U6,电机编码器AB相输入,正交编码器,电机正反转获取输出对应脉冲数与方向,求一份测试代码
    发表于 01-23 15:49

    谁能发一份自己正在用的PROTEL原理图和PCB的库给我,谢谢了

    谁能发一份自己正在用的PROTEL原理图和PCB的库给我,谢谢了
    发表于 12-31 12:37

    编码风格编码

    本帖最后由 mr.pengyongche 于 2013-4-30 02:56 编辑 编码风格编码
    发表于 08-17 09:34

    分享一份PCB设计经验总结性的资料

    分享一份PCB设计经验总结性的资料
    发表于 07-09 09:59

    Linux内核编码风格(编程代码风格推荐)

    半天没理解的程序。后来直接用indent -kr -i8给他转换格式来看了。特此转过来个关于代码风格的帖子分享下~Linux内核编码风格
    发表于 08-24 09:45

    分享一份汽车电子行业的C标准 精选资料分享

    关注+星标公众号,不错过精彩内容排版整理 | 嵌入式大杂烩之前给大家分享过MISRA C 相关的内容,今天给大家分享一份汽车电子行业的MISRA C标准。什么是MISRA? MISRA ...
    发表于 07-20 06:34

    博士生David Abel详细整理一份87页的ICML大会笔记

    很多博士生可能觉得论文眼花缭乱看都不看不过来,更不要说整理一份详细的笔记。而对很多还没有机会参加 ICML 这样顶级大会的人来说,显然,David Abel 的笔记成了他们的福音,有人说快要完全依赖他的笔记过活了。
    的头像 发表于 07-18 14:45 3118次阅读
    博士生David Abel详细<b class='flag-5'>整理</b>了<b class='flag-5'>一份</b>87页的ICML大会笔记

    Oracle-sql语句收集整理大全

    Oracle-sql语句收集整理大全(开关电源技术综述课题)-文档为Oracle-sql语句收集整理大全总结文档,是一份不错的参考资料,感兴趣的可以下载看看,,,,,,,,,,,,,
    发表于 09-17 12:39 8次下载
    Oracle-sql语句收集<b class='flag-5'>整理</b>大全

    Zstack中实现自己的任务总结

    Zstack中实现自己的任务总结(现代电源技术基础答案)-该文档为Zstack中实现自己的任务总结讲解文档,是一份不错的参考资料,感兴趣的可
    发表于 09-24 15:10 14次下载
    Zstack中实现<b class='flag-5'>自己</b>的任务<b class='flag-5'>总结</b>

    总结一份嵌入式硬件开发的具体流程

    关注、星标公众号,直达精彩内容来源:网络素材整理:李肖遥传送门: 总结一份嵌入式产品研发的具体流程之前,我们详细讲述了嵌入式产品的研发流程,那么在这节,我们具体以嵌入式产品的硬件部
    发表于 11-04 10:51 18次下载
    <b class='flag-5'>总结</b>了<b class='flag-5'>一份</b>嵌入式硬件开发的具体流程

    一份阅卷准则+多不同文体的作文提纲或模板=ASPICE

    总结下,一份阅卷准则+多不同文体的作文提纲或模板=ASPICE,你基于自己的能力和风格,写出
    发表于 08-19 11:47 1083次阅读

    Gowin HDL编码风格用户指南

    本手册主要描述高云®HDL 编码风格要求及原语的 HDL 编码实现,旨在 帮助用户快速熟悉高云 HDL 编码风格和原语实现,指导用户设计,
    发表于 09-15 16:02 0次下载
    Gowin HDL<b class='flag-5'>编码</b><b class='flag-5'>风格</b>用户指南

    一份最新的3Gpp频段表

    整理一份最新的3Gpp 频段表,今天分享给大家。
    的头像 发表于 11-29 10:19 6309次阅读

    什么是良好的Verilog代码风格

    1. 前言 之前在公司负责制定代码规范,费了九牛二虎之力,终于整理出来一份文档。由于保密规定的缘故,无法与大家直接分享这份文档,但是文档中的大部分规范都是我自己长期总结出来的,在这里也
    的头像 发表于 12-22 14:32 853次阅读

    Verilog编码风格的建议

    良好的编码风格,有助于代码的阅读、调试和修改。虽然 Verilog 代码可以在保证语法正确的前提下任意编写,但是潦草的编码风格往往是锤子买
    的头像 发表于 06-01 16:27 683次阅读
    Verilog<b class='flag-5'>编码</b><b class='flag-5'>风格</b>的建议