嵌入式c语言编码规范
学习嵌入式的同学应该首先掌握嵌入式编码规范,这样才能更好的嵌入式系统。
下面就从这几个方面讲解一下嵌入式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语言编码规范的更多相关文章
- Uber Go 语言编码规范
Uber Go 语言编码规范 Uber 是一家美国硅谷的科技公司,也是 Go 语言的早期 adopter.其开源了很多 golang 项目,诸如被 Gopher 圈熟知的 zap.jaeger 等.2 ...
- Java语言编码规范(Java Code Conventions)
Java语言编码规范(Java Code Conventions) 名称 Java语言编码规范(Java Code Conventions) 译者 晨光(Morning) 简介 本文档讲述了Java语 ...
- 03-C语言编码规范和变量
目录: 一.C语言的编码规范 二.变量 三.浮点型float 四.变量名命名规则 五.变量作用域与生命周期 回到顶部 一.C语言的编程规范 1 语句可以分开放在任意位置 2 空格可以让代码更清晰 3 ...
- 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 包和引入语句 ...
- ASP编码规范
ASP编码规范(--::) 第一章 ASP编码规范通述 ASP编码分为两大部分,一部分为静态文件编码,一部分为包含服务器端脚本的动态文件编码. 静态文件编码分script编码和HTML编码两部分. 服 ...
- Go语言安全编码规范-翻译(分享转发)
Go语言安全编码规范-翻译 本文翻译原文由:blood_zer0.Lingfighting完成 如果翻译的有问题:联系我(Lzero2012).匆忙翻译肯定会有很多错误,欢迎大家一起讨论Go语言安全能 ...
- 华为C语言编程规范
DKBA华为技术有限公司内部技术规范DKBA 2826-2011.5C语言编程规范2011年5月9日发布 2011年5月9日实施华为技术有限公司Huawei Technologies Co., Ltd ...
- PHP开发编码规范
(转载:https://blog.csdn.net/alexdream/article/details/2213313) 这些年来多从事Linux下PHP和C相关的开发,带过很多项目和团队,下面是根据 ...
- 一份比较全面的PHP开发编码规范.
这些年来多从事Linux下PHP和C相关的开发,带过很多项目和团队,下面是根据经验整理的PHP编码规范,可以用作给大家的范例和参考,根据需要进行取舍和修改! (可能最新的一些php5的规范不够完整,今 ...
随机推荐
- 【pwnable.kr】 flag
pwnable从入门到放弃 第四题 Download : http://pwnable.kr/bin/flag 下载下来的二进制文件,对着它一脸懵逼,题目中说是逆向题,这我哪会啊... 用ida打开看 ...
- python基础【2】——python数据类型之字符串
python数据类型-字符串 一. 字符串的表示方法(str) 作用: 记录文本信息 表示方法:' ' 单引号 " "双引号 ''' '''三单引号 ""&qu ...
- 201771010123汪慧和《面向对象程序设计Java》第十二周实验总结
一.理论部分 1.在Java提供的GUI构建工具中可以分为组件和容器两类. 2.在Java中的组件有:按钮.标签.复选框.单选按钮.选择框.列表框.文本框.滚动条.画布.菜单. 3.在Java中的容器 ...
- Java算法练习——无重复字符的最长子串
题目链接 题目描述 给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度. 示例 1 输入: "abcabcbb" 输出: 3 解释: 因为无重复字符的最长子串是 &qu ...
- [CQOI2016]K远点对(KD-Tree)
暴力的做法应该是这样的,维护大小为k的堆,每次插入两点间距离并弹出堆顶. 然后这个做法显然是可以KD-Tree优化的,建立KD-Tree,然后如果该平面内最远点小于堆顶,则直接退出.就当做是复习很久没 ...
- StarUML类图相关——关联、聚合、组合、泛化、依赖、实现
在阅读设计模式相关的书籍,或者其他一些项目.相关博客等等,经常会遇到类图,它对于一个类的信息,如变量.方法及其可见性,类与类(接口)之间的继承关系.依赖关系.聚合关系.组合关系等,都可以比较形象得当地 ...
- UVM实战[一]
一个新的连载系列,将以一个实际的UVM环境代码讲解的使用.机制等,更新周期会比较长. 文件说明 分享的文件是我个人和同学在参加复微杯大学生电子设计大赛中所完成的设计.赛题来自数字命题AI赛道,有兴趣可 ...
- 学生信息的添加 Java web简单项目初试(失败)
题目要求: 1登录账号:要求由6到12位字母.数字.下划线组成,只有字母可以开头:(1分) 2登录密码:要求显示“• ”或“*”表示输入位数,密码要求八位以上字母.数字组成.(1分) 3性别:要求用单 ...
- 未能加载文件或程序集“MySql.Data”或它的某一个依赖项。找到的程序集清单定义与程序集引用不匹配。 (异常来自 HRESULT:0x80131040)
未能加载文件或程序集“MySql.Data”或它的某一个依赖项.找到的程序集清单定义与程序集引用不匹配. (异常来自 HRESULT:0x80131040) 说明: 执行当前 Web 请求期间,出现未 ...
- UVALive 3942 字典树+dp
其实主要是想学一下字典树的写法,但这个题目又涉及到了DP:这个题目要求某些单词组成一个长子串的各种组合总数,数据量大,单纯枚举复杂度高,首先肯定是要把各个单词给建成字典树,但是之后该怎么推一时没想到. ...