学习嵌入式的同学应该首先掌握嵌入式编码规范,这样才能更好的嵌入式系统。

下面就从这几个方面讲解一下嵌入式c编码规范。

注释风格、排版风格、头文件风格、变量定义、宏定义、函数

1 注释风格

1.1  注释的原则是有助于对程序的阅读和理解,注释不宜太多也不能太少。注释语言必须准确、易懂、简洁,没有歧义性。

1.2  程序文件头部代码应进行注释。注释必须列出:版权说明、版本号、生成日期、作者、内容、功能、与其他文件的关系、修改日志等。头文件的注释中还应有函数功能简要说明。

/*

* Copyright(C), 2007-2008, Red Hat Inc. // 版权声明

* File name: // 文件名

* Author:      // 作者

* Version:    // 版本

* Date: // 完成日期

* Description: // 描述本文件的功能,与其他模块的关系

* Function List: // 主要函数的列表,每条记录应包括函数名及功能简要说明

* History:    // 修改历史,包括每次修改的日期、修改者和修改内容简述

*/

1.3  函数头部应进行注释,列出函数的功能、输入参数、输出参数、返回值、调用关系等。

/*

* Function:      // 函数名称

* Description:    // 函数功能、性能等的描述

* Calls:      // 被本函数调用的函数清单

* Called By:      // 调用本函数的函数清单

* Input:          // 输入参数说明,包括每个参数的作用

* Output:        // 输出参数说明,有时通过指针参数返回一些变量值

* Return:          // 函数返回值的说明

* Others:        // 其他说明

*/

1.4  对于所有有特定含义的变量、常量、宏、结构体等数据结构,如果其命名不是充分自注释的,在声明时都必须加上注释,说明其实际含义。变量、常量、宏的注释应放在其上方或右方。

1.5  全局变量要有较详细的注释,包括功能,取值范围,哪些函数访问它,访问时的注意事项。

1.6  为使程序排版整齐,方便阅读和理解,注释也要进行缩进和对齐。

void example_function( void )

{

/* comments one */

unsigned int min_port, max_port;

/* comments two */

if ...

}

1.7  在复杂程序块的结束行右方加注释,以表明某程序块的结束。

示例:

if (...)

{

...

while ( ... )

{

...

} /* while ( ... )循环语句结束*/

...

} /* end of  if (...)语句结束 */

2 排版风格

2.1  相对独立的程序块之间、变量声明之后必须加空行。

int          conn_fd;

int          ret;

conn_fd = socket(AF_INET, SOCK_STREAM,0);

if (conn_fd < 0) {

perror("socket create");

}

2.2  程序块要采用缩进风格编写,缩进为4个空格或一个Tab键。

2.3  对于较长的语句(超过个80字符)要分成多行书写,划分出的新行要进行适当的缩进,使排版整齐,语句可读。对于参数较长的函数也要划分成多行。

ret = connect(conn_fd, (struct sockaddr *)&serv_addr,

sizeof (struct sockaddr));

2.4  一行只写一条语句,不允许把多个短语句写在一行中。

以下语句是不规范的:

min_port = 1; max_port = 65535;

应该如下书写:

min_port = 1;

max_port = 65535;

2.5  if、for、do、while、case、switch、default等语句各自占一行,且if、for、do、while等语句的执行语句部分无论多少都要加括号{ }。

以下语句是不规范的:

if (conn_fd < 0) perror("socket create");

应该如下书写:

if (conn_fd < 0) {

perror("socket create");

}

2.6  ‘{’  和 ‘}’ 要独占一行

for (i=1; i<argc; i++)

{

...

}

或者在代码中‘{’与for语句同行,‘{’前面要有一个空格。

for (i=1; i<argc; i++) {

...

}

2.7  空格的使用

(1)以下语句在逗号后面加空格。

int min_port, max_port;

(2)"+"、"-"、"*"、"="等算术运算符两边都有一个空格。

a = i + j;

(3)"<"、">="等比较操作符两边都有一个空格。

if (conn_fd < 0) {

(4)"!"、"~"、"++"、"--"、"&"(地址运算符)等单目操作符前后不加空格。

i++;

(5)"->"、"."前后不加空格。

portinfo.min_port = i * seg_len + 1;

3 变量定义

3.1  变量命名要清晰明了,有明确含义,同时使用完整的单词或大家基本可以理解的缩写,避免使人产生误解。

示例:

temp可以简写为tmp

message可以简写为msg

3.2  对于变量命名,禁止使用单个字符(如i、j、k),建议除了要有具体含义外,还能表明其数据类型等,但i、j、k作为局部循环变量是允许的。

int iwidth; // i表明该变量为int型,width指明是宽度

3.3  在Linux下变量命名一般是全小写加下划线的风格。

一般使用:

int min_port;

一般不使用:

int minPort;

3.4  在多线程程序中使用全局变量,应注意对变量操作的原子性。

3.5  应避免局部变量与全局变量同名。

3.6  严禁使用未经初始化的变量作为右值。在C程序中,引用未经赋值的指针,经常会引起程序崩溃。

以下代码在Linux下将导致错误,原因在于:没有使p_string指向某个内存空间的情况下,即对其进行操作是错误的。

char *p_string;

p_sting[0] = ‘a’;

应先进行初始化:

char *p_string;

p_string = (char *)malloc(BUFF_SIZE);          // 这里假设BUFF_SIZE已定义

p_sting[0] = ‘a’;

4 宏定义

4.1  代码中尽量少使用字面常量,而使用宏常量。

4.2  宏定义时宏名尽量大写

4.3  如果宏名由多个单词组成,那么个单词中间要加_

#define BUFF_SIZE          1024

input_data = (char *)malloc(BUFF_SIZE);

4.4  用宏定义表达式时,要使用完备的括号。

如下定义的宏存在一定的风险:

#define GET_AREA(a,b)     a*b

应该定义为:

#define GET_AREA(a,b)     ((a)*(b))

4.5  若宏中有多条语句,应该将这些语句放在一对大括号中。

下面语句中只有宏的第一条表达式被执行。

#define INTI_RECT_VALUE( a, b )\

a = 0;\

b = 0;

for (index = 0; index < RECT_TOTAL_NUM; index++)

INTI_RECT_VALUE( rect.a, rect.b );

正确的用法应为:

#define INTI_RECT_VALUE( a, b ) {\

a = 0;\

b = 0;\

}

for (index = 0; index < RECT_TOTAL_NUM; index++) {

INTI_RECT_VALUE( rect[index].a, rect[index].b );

}

5函数定义

5.1  一个函数完成一个特定的功能,不应尝试在一个函数中实现多个不相关的功能。

5.2  检查函数所有输入参数的有效性,比如指针型参数要判断是否为空,数组成员参数判断是否越界。

5.3  一个函数的规模应限制在200行以内(不包括空行和注释行)。

5.4  函数的功能应该是可以预测的,也就是只要输入数据相同就应产生同样的预期输出。

5.5  函数的参数不宜过多,以1~3个为宜。

5.6  函数名应准确描述函数的功能,一般以动词加宾语的形式命名。

void print_record( struct *p_record, int record_len) ;

5.7  函数的返回值要清楚、明了,让使用者不容易忽视错误情况。函数的每种出错返回值的意义要清晰、明确,防止使用者误用,理解错误或忽视错误返回码。

5.8  如果多段代码重复做同一件事情,那么应该考虑把重复功能实现为一个函数。

5.9  减少函数本身或函数间的递归调用。

递归调用特别是函数间的递归调用(如A->B->C->A),影响程序的可理解性;递归调用一般都占用较多的系统资源(如栈空间);递归调用对程序的测试不利。

6头文件风格

6.1 头文件可保存如下内容:宏定义、类型定义、结构体定义、变量声明、函数声明

不要有如下内容:变量定义、函数定义

6.2 头文件必须要有重复包含限制

#ifndef _ALPS_H

#define _ALPS_H

...

#endif

嵌入式c语言编码规范的更多相关文章

  1. Uber Go 语言编码规范

    Uber Go 语言编码规范 Uber 是一家美国硅谷的科技公司,也是 Go 语言的早期 adopter.其开源了很多 golang 项目,诸如被 Gopher 圈熟知的 zap.jaeger 等.2 ...

  2. Java语言编码规范(Java Code Conventions)

    Java语言编码规范(Java Code Conventions) 名称 Java语言编码规范(Java Code Conventions) 译者 晨光(Morning) 简介 本文档讲述了Java语 ...

  3. 03-C语言编码规范和变量

    目录: 一.C语言的编码规范 二.变量 三.浮点型float 四.变量名命名规则 五.变量作用域与生命周期 回到顶部 一.C语言的编程规范 1 语句可以分开放在任意位置 2 空格可以让代码更清晰 3 ...

  4. Java语言编码规范 - Java语言编码规范(中文版)(http://doc.javanb.com/code-conventions-for-the-java-programming-language-zh/index.html)

      目录 1 介绍 1.1 为什么要有编码规范 1.2 版权声明 2 文件名 2.1 文件后缀 2.2 常用文件名 3 文件组织 3.1 Java源文件 3.1.1 开头注释 3.1.2 包和引入语句 ...

  5. ASP编码规范

    ASP编码规范(--::) 第一章 ASP编码规范通述 ASP编码分为两大部分,一部分为静态文件编码,一部分为包含服务器端脚本的动态文件编码. 静态文件编码分script编码和HTML编码两部分. 服 ...

  6. Go语言安全编码规范-翻译(分享转发)

    Go语言安全编码规范-翻译 本文翻译原文由:blood_zer0.Lingfighting完成 如果翻译的有问题:联系我(Lzero2012).匆忙翻译肯定会有很多错误,欢迎大家一起讨论Go语言安全能 ...

  7. 华为C语言编程规范

    DKBA华为技术有限公司内部技术规范DKBA 2826-2011.5C语言编程规范2011年5月9日发布 2011年5月9日实施华为技术有限公司Huawei Technologies Co., Ltd ...

  8. PHP开发编码规范

    (转载:https://blog.csdn.net/alexdream/article/details/2213313) 这些年来多从事Linux下PHP和C相关的开发,带过很多项目和团队,下面是根据 ...

  9. 一份比较全面的PHP开发编码规范.

    这些年来多从事Linux下PHP和C相关的开发,带过很多项目和团队,下面是根据经验整理的PHP编码规范,可以用作给大家的范例和参考,根据需要进行取舍和修改! (可能最新的一些php5的规范不够完整,今 ...

随机推荐

  1. 个人微信开发API协议(转)

    安卓微信的api,个人微信开发API协议,微信 ipad sdk,微信ipad协议,微信web版接口api,微信网页版接口,微信电脑版sdk,微信开发sdk,微信开发API,微信协议,微信接口文档sd ...

  2. PHP日期函数

    在正式学习日期函数前大家得了解几个概念: 1.时区 2.世界时 3.unix时间戳 时区 这个概念,之前大家听说过很多.我们来啰嗦两句,我们现实生活中使用的实区,在电脑里面也是一样有规定的.1884年 ...

  3. 吴裕雄--天生自然JAVA SPRING框架开发学习笔记:Spring框架的基本思想

    EJB的学习成本很高,开发效率却不高,需要编写很多重复的代码,这些问题阻止了EJB的继续发展.就在EJB技术止步不前的时候,Spring框架在合适的时机出现了,Spring框架和EJB不同,Sprin ...

  4. Android自定义View——彩色圆环统计图

      1.初始化变量 圆的粗细:圆环的大小. 标注:文字前面的圆点. 分配比例大小:由于需要计算圆环扫过的角度,计算方法使用:(比例/100)*360度,用百分比算出360度占用了多少,由于比例/100 ...

  5. cf1228 D Complete Tripartite(哈希)

    题意: 无向简单图,无自环,无重边,n个点,m条边,请你将这n个点分为3个互相没有交集的集合.并且满足以下条件: 1.同一个集合中的任意两点之间没有边. 2.每个点都要与除了它这个集合以外的所有点相连 ...

  6. 图片分割之GrabCut算法、分水岭算法

    https://www.cnblogs.com/zyly/p/9392881.html 所谓图像分割指的是根据灰度.颜色.纹理和形状等特征把图像划分成若干互不交迭的区域,并使这些特征在同一区域内呈现出 ...

  7. IDEA--IDEA配置web项目

    参考:https://blog.csdn.net/kfm1376822651/article/details/79666586 记学习springmvc时,使用idea部署web项目至tomcat. ...

  8. Spring最基础使用1

    1. 导入Spring等jar包 2. 配置文件 applicationContext.xml <?xml version="1.0" encoding="UTF- ...

  9. Maven:程序包不存在,找不到符号

    maven build时出现了以下的错误: 程序包xx.xx不存在,xxx找不到符号 原因一:DAO层依赖Service接口层的Bean类,在pom.xml中添加了对Service的依赖,也因此引入了 ...

  10. try,catch,finally尝试(一个程序块多个catch)

    曾学过c++,但是对这些异常捕捉不是很了解,通过别的编程语言了解 public class newclass { public static void main(String[] args) { tr ...