当前位置: 首页 > news >正文

嵌入式C学习笔记之编码规范

一、程序员的态度
1、不太愿意测试自己的代码
2、不太愿意检查团队成员的代码
二、专业程序员
1、与业余程序相比,专业程序员更注重自己的代码风格。
2、专业程序员才能写出人能读懂的代码。
3、专业程序员要保证自己的代码没有BUG。
三、编码规范
1、程序开发流程
0)需求分析
1)功能设计
2)编写代码
3)单元测试
4)功能测试
5)代码REVIEW
2、公司开发,一般会有公司的开发规范。
3、代码风格要有助于其他程序员易于理解。
四、宏观上高质量编码规范
1、版本和版权的声明
2、头文件结构
1)版本和版权的声明
2)预处理部分
3)函数或者结构体声明
3、头文件使用注意事项
1)为了防止头文件被重复引用,在代码中使用:
#ifndef、#ifdef、#define、#endif
2)引用标准头文件:
#include <标准头文件名.h>
3)引用非标准头文件:
#include "非标准头文件名.h"
4)头文件中只存放"声明",不存放"定义"
void pr();//这是声明
void pr(){//这是定义,实现
函数体
}
5)多个c文件合并生成.out/.exe可执行文件的过程
方法一
把定义部分.c文件单独编译成.o文件
gcc 1.c  -c 
再把包含main函数的源文件也单独编译成.o文件
gcc 2.c -c
最后把多个.o文件链接生成可执行文件.out
gcc  1.o  2.o
方法二
gcc *.c
6)不提倡使用全局变量,尽量不要在头文件中出现
extern int XXX;
4、源文件
1)定义文件开头处的版权和版本信息
2)对一些头文件的引用
3)程序功能的实现代码,包括数据声明和函数实现
5、大的项目会涉及到工程目录结构问题
1)通常会把头文件和定义文件分别保存于不同的目录:source,include,lib
2)根据需要,对某些信息进行隐藏
6、命名规范
1)在变量或者函数名前面加前缀
2)符合标识符命名规范
7、程序的版式要求
1)空行的合理使用会增加程序的可读性
2)一般每个函数定义结束之后加一个空行
3)代码行,一行代码只做一件事件
4)if、for、while、do语句独占一行,循环体都用大括号
5)尽可能在定义变量的同时初始化变量(就近原则)
6)代码行内空格问题:{
关键字之后要留空格,
函数名之后不要空格,紧跟左括号,以与关键字区别
二元运算符的前后一般应当加空格,一元运算符前后不加空格
[]、.、->这些运算符前后不加空格
逗号运算符之后加空格
}
7)代码对齐{
{}左右大括号应当独占一行并且位于同一行,同时与引用它们的语句左对齐
{}内代码在左大括号{右边缩进tab位。
}
8)注释
//XXXXX
/*XXX*/
.....

五、微观上高质量编码规范
1、程序健壮性
1)条件:在保证条件确定和不确定的情况下,程序都能正常运行。
2)复合表达式:
a = b = c = 0;简洁,提高编译效率
不要编写太复杂的复合表达式。
不要编写有多用途的复合表达式:d = (a = b + c) + r;不建议
不要把程序中复合表达式与数学的数学式子混淆
if(a > b && b > c){}  与 if (a > b > c){};
对           功能错
3)if语句
(1)逻辑值(真1,假0)    与 零值 比较 :flag = n % 2  或者 flag = a > b;
if(flag){}
if (!flag){}
(2)整型值与零值 比较   ==  或 !=
(3)浮点值与零值 比较 ,不要使用 ==  或 !=,使用 >= 或 <= 
10.0/3*3  在程序中不一定得 10
(4)指针变量与零值 比较,使用==  或 != 与 NULL比较
4)使用const提高函数的健壮性
1)const定义只读变量 const int a = 100;
2)可以使用const来修饰函数的形参(也叫输入参数)
如果使用const修饰了一个指针,则指针指向的数据不能修改
void strCopy(char *destionStr,const char *sourceStr){}
3)使用const修饰函数的返回值,修饰返回的指针,则指针指向的数据不能修改
const char *getString(){}
调用此函数时:
char *str = getString();//编译报错
const char *str = getString();//正确
5)内存管理的规范
(1)如何是动态申请内存,使用malloc之后,一定要判断指针值是否为NULL,以避免没有申请到空间的情况。

(2)不要忘记给数组或者动态申请的内存空间赋值,以避免使用没有初始化内存的值。
(3)避免数组和指针的下标越界,多1或少1的情况。
(4)动态内存的申请和释放必须配对出现,防止内存泄漏。
(5)free之后的指针不要再使用,为了防止这种使用野指针的情况,free之后应立即让指针值为NULL

            (6)当指针变量做为某一个函数的形参时,不要在函数内使用此指针动态申请空间。否则运行报错。
void getMemory(char *p,int n){
p = (char *)malloc(sizeof(char) * n);

}
void main(){
char *str = NULL;
getMemory(str,100);
strcpy(str,"hello world");//报错,原因是str地址依然是NULL
}
(7)不要使用return语句返回指向“栈内存”的指针,可以是static内存空间地址

2、程序的优化
1)使用常量的情况
2)循环语句
(1)在多重循环中,如有可能,将循环次数多的循环做为内循环,循环次数的少的循环做为外循环,以减少cpu跨越循环层的次数。
(2)当循环体中有条件,且循环次数较多,如有可能,将条件移动循环体外面。
(3)尽量做到不要在for循环体中修改循环变量,以防止循环失控。
for(XXXX ; XXX ;循环变量改变){  
不要在此进行循环变量改变
}    

        

http://www.dtcms.com/a/359880.html

相关文章:

  • Nginx实现P2P视频通话
  • 现代C++特性 并发编程:线程管理库 <thread>(C++11)
  • 狂神说--Nginx--通俗易懂
  • 【秋招笔试】2025.08.31饿了么秋招笔试题
  • Linux基本工具(yum、vim、gcc、Makefile、git、gdb)
  • 苏宁移动端部分首页制作
  • ing Data JPA 派生方法 数据操作速查表
  • TFS-1996《The Possibilistic C-Means Algorithm: Insights and Recommendations》
  • Kafka面试精讲 Day 3:Producer生产者原理与配置
  • K8s学习笔记(一)——
  • Unity转抖音小游戏重点摘记
  • 通信原理(006)——分贝(dB)超级详细
  • 【数学史冷知识】关于行列式的发展史
  • spring-ai-alibaba-deepresearch 学习(七)——源码学习之PlannerNode
  • (树)Leetcode94二叉树的中序遍历
  • 8.29学习总结
  • YOLO 目标检测:YOLOv2基本框架、多尺度训练、锚框、维度聚类、位置预测、passthrough
  • 【机器学习基础】无监督学习算法的现代演进:从数据探索到智能系统的自主发现能力
  • hardhat 3 测试框架选择
  • 十分钟快速掌握 YML YAML 文件
  • LLM记账智能体-MCP服务-实现步骤与效果展示
  • Qt精华版打包教程,支持windows和Linux,每种平台支持2种方案
  • MCP SDK 示例一
  • Spring MVC 九大组件源码深度剖析(六):HandlerExceptionResolver - 异常处理的艺术
  • 第八章 光照
  • 蓝牙AOA智慧仓储管理系统:实现仓储数字化升级的精准定位解决方案
  • 解决IDEA 2025.2升级报错:Scannning Files to Index卡住问题分析与修复
  • python复杂代码如何让ide自动推导提示内容
  • 【系列12】端侧AI:构建与部署高效的本地化AI模型 第11章:边缘设备与IoT部署
  • Wi-Fi技术——网络安全