嵌入式c语言编码规范

news2024/11/25 21:29:24

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

下面就从这几个方面讲解一下嵌入式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

嵌入式物联网需要学的东西真的非常多,千万不要学错了路线和内容,导致工资要不上去!

分享大家一个资料包,差不多150多G。里面学习内容、面经、项目都比较新也比较全!(点击找小助理领取)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/740497.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

通过(.zip 压缩文件)安装及卸载MySQL

文章目录 一、MySQL安装1.下载MySQL压缩包2.将下载好的压缩包解压到一个没有中文路径的目录下3.配置MySQL环境变量4.验证是否配置成功5.初始化MySQL数据库6.注册MySQL服务7.启动MySQL服务8.修改MySQL数据库默认账户密码9.登录MySQL数据库10.退出MySQL 二、MySQL卸载1.以管理员身…

什么是EDI 180 退货授权和通知?

EDI 180 退货授权和通知是零售商和供应商在退货过程中使用的电子数据交换&#xff08;EDI&#xff09;文件。它既可以作为请求和授权&#xff0c;也可以作为通知文件。 EDI 180 的基本组成部分是什么&#xff1f; EDI 180 交易需要包括有关退货的关键信息。由于EDI 180可以双…

Linux 批量杀掉进程(包含某个关键字)

一、场景说明 现场环境有十多个包含 ”celery” 关键字的进程在运行&#xff0c;每次重启服务&#xff0c;需要将这些进行kill掉&#xff0c;然后重新启动。 可以用如下命令批量kill掉这些进程&#xff1a; kill -9 PID1 PID2 PID3 PID4.....其中&#xff0c;PID是查询到的进…

第九章——内存模型和名称空间

单独编译 C允许程序员将组件函数放在独立的文件中。下面列出了头文件中常包含的内容&#xff1a; 函数原型使用#define或const定义的符号常量结构声明类声明模板声明内联函数 将结构声明放在头文件中是可以的&#xff0c;因为它们不创建变量&#xff0c;而只是在源代码文件…

数据结构--树的存储结构

数据结构–树的存储结构 树的逻辑结构 树是 n ( n ≥ 0 &#xff09; n (n\ge0&#xff09; n(n≥0&#xff09;个结点的有限集合&#xff0c;n 0 时&#xff0c;称为空树&#xff0c;这是一种特殊情况。 在任意一棵非空树中应满足: 1&#xff09;有且仅有一个特定的称为 根 …

如何执行Photoshop脚本

环境 Photoshop: CC2017 OS: Windows 10 脚本放置位置 C:\Program Files\Adobe\Adobe Photoshop CC 2015\Presets\Scripts #也就是 PS的安装目录\Presets\Scripts

操作系统接口 MIT 6.828 - 1. Lab 01: Xv6 and Unix utilities

本文会将lab1中的思路以及知识点进行分析&#xff0c;并作为作者学习MIT 6.828的一个学习总结&#xff0c;希望能够帮助到学习该lab的同学们 中文版书籍&#xff1a;中文版书籍 实验教案地址&#xff1a;教案地址 操作系统接口 在操作系统中&#xff0c;为了能够有效地与操作系…

Amelia、Bookly 和 Booked:哪个WordPress预约插件更好?

各种企业都需要预订软件来管理预约。然而&#xff0c;开发预订系统是网站中最复杂和最昂贵的元素之一。 那些使用 WordPress 构建网站的人有一个优势。只需点击几下&#xff0c;他们就可以将预约插件集成到他们的网站中。 预约插件是一个预订向导&#xff0c;可以自动执行和管…

数据结构——堆的实现(细)

目录 1.1 二叉树的顺序结构 普通的二叉树是不适合用数组来存储的&#xff0c;因为可能会存在大量的空间浪费。而完全二叉树更适合使用顺序结构存储。现实中我们通常把堆(一种二叉树)使用顺序结构的数组来存储&#xff0c;需要注意的是这里的堆和操作系统虚拟进程地址空间中的堆…

Netty核心技术十--Netty 核心源码剖析

1. 基本说明 只有看过Netty源码&#xff0c;才能说是真的掌握了Netty框架。 在 io.netty.example 包下&#xff0c;有很多Netty源码案例&#xff0c;可以用来分析 2. netty 启动过程源码分析 本次分析使用的是example包下的echo 2.1 源码剖析的目的 用源码分析的方式走一下…

Java 动态规划 Leetcode 63. 不同路径 II

该题大部分思路可以根据Leetcode 62. 不同路径这篇博客了解 这里进行基于上面那篇博客后来对该题进行补充 代码展示&#xff1a; class Solution {public int uniquePathsWithObstacles(int[][] obstacleGrid) {int mobstacleGrid.length;int nobstacleGrid[0].length;//创建…

HDFS块详解

HDFS块详解 传统型分布式文件系统的缺点 现在想象一下这种情况&#xff1a;有四个文件 0.5TB的file1&#xff0c;1.2TB的file2&#xff0c;50GB的file3&#xff0c;100GB的file4&#xff1b;有7个服务器&#xff0c;每个服务器上有10个1TB的硬盘。 在存储方式上&#xff0c;我…

Docker安装ElasticSearch8.X docker安装elasticsearch8.X完整详细教程

Docker安装ElasticSearch8.X docker安装elasticsearch8.X完整详细教程 Docker 上安装 ElasticSearch 8.8.1 的步骤&#xff1a;选择要安装的ElasticSearch 版本1、拉取 ElasticSearch 镜像2、创建并运行容器关闭容器启动容器重启容器 3、elasticsearch常用端口以及作用4、测试&…

基于spring cloud alibaba的低代码核心工具,jvs-logic逻辑引擎

在现代企业管理中&#xff0c;决策扮演着至关重要的角色。然而&#xff0c;随着业务规模的扩大和数据量的增加&#xff0c;人工决策变得越来越困难和耗时&#xff0c;而且容易受到主观因素的影响。逻辑引擎的出现为企业提供了一种高效、准确的决策推理工具&#xff0c;能够以逻…

[工业互联-23]:EtherCat从站 - EtherCAT协议栈与工作原理, 软硬件解决方案

目录 第1章 EtherCAT通信原理 1.1 网络架构 1.2 分层模型 2.1 物理层 1.2 数据链路层 1.2.1 EtherCAT数据帧结构 1.2.2 EtherCAT报文寻址 第2章 EtherCAT从站 2.1 概述 2.2 EtherCAT从站的组成包括&#xff1a; 2.3 EtherCAT从站的硬件 2.4 从站控制信息芯片&#…

LeetCode[394]字符串解码

难度&#xff1a;Medium 题目&#xff1a; 给定一个经过编码的字符串&#xff0c;返回它解码后的字符串。 编码规则为: k[encoded_string]&#xff0c;表示其中方括号内部的 encoded_string 正好重复 k 次。注意 k 保证为正整数。 你可以认为输入字符串总是有效的&#xff1b;…

【LeetCode热题100】打卡第34天:排序链表乘积最大的子数组

文章目录 【LeetCode热题100】打卡第34天&#xff1a;排序链表&乘积最大的子数组⛅前言 排序链表&#x1f512;题目&#x1f511;题解 乘积最大的子数组&#x1f512;题目&#x1f511;题解 【LeetCode热题100】打卡第34天&#xff1a;排序链表&乘积最大的子数组 ⛅前…

如何将文字转化为语音?三个方法帮你轻松实现!

如何将文字转化为语音&#xff1f;在工作或学习中&#xff0c;我们可能会遇到需要将文字转化为语音的情况&#xff0c;这可能会让一些人感到困惑&#xff0c;不知道如何实现这个转换。其实&#xff0c;只需要利用一些第三方工具&#xff0c;就可以轻松地将文字转化为语音。下面…

十四、flex弹性容器属性样式2

目录&#xff1a; 1.准备工作 2.属性解析&#xff1a; align-items 3.属性解析&#xff1a; align-content 4.弹性元素的属性 一、准备工作 我们在前面的基础上&#xff0c;修改代码&#xff0c;把ul的高度定下来&#xff0c;设置800px, li的高度不定。 然后&#xff0c;body里…

音频采样器 Native Instruments Kontakt7 forMac/Windows图文安装教程

Native Instruments Kontakt是一款功能强大、灵活易用的音乐采样软件&#xff0c;适用于各种音乐创作和制作需求。无论是专业音乐制作人还是初学者&#xff0c;都能通过它来实现创意的音乐作品。 Kontakt具有直观的用户界面&#xff0c;可通过拖放方式导入和管理采样库。它支持…