搜索
查看
编辑修改
首页
UNITY
NODEJS
PYTHON
AI
GIT
PHP
GO
CEF3
JAVA
HTML
CSS
搜索
很楠不爱3
这个屌丝很懒,什么也没留下!
关注作者
热门标签
jquery
HTML
CSS
PHP
ASP
PYTHON
GO
AI
C
C++
C#
PHOTOSHOP
UNITY
iOS
android
vue
xml
爬虫
SEO
LINUX
WINDOWS
JAVA
MFC
CEF3
CAD
NODEJS
GIT
Pyppeteer
article
热门文章
1
数据结构集合
2
Git与IDEA的一些冲突问题_gitee创建的仓库导致的readme与idea的版本号不一样怎么办
3
command git --no-replace-objects ls-remote ssh://git@github.com/nhn/raphael.git npm ERR
4
数据结构-哈希表
5
AI芯片行业深度:发展现状、竞争格局、市场空间及相关公司深度梳理_人工智能芯片行业
6
图书管理系统(Java实现)_图书管理系统java
7
毕业设计-基于Python爬虫的疫情数据可视化系统
8
探索大语言模型在图学习上的潜力
9
关于jointjs的详细介绍
10
VS2022部署/安装 QT(以5.14.2为例)_vs2022 qt
当前位置:
article
> 正文
浅谈C语言编程风格问题_c编程 没有.h 风格
作者:很楠不爱3 | 2024-05-05 01:09:57
赞
踩
c编程 没有.h 风格
C语言编程过程中有一个良好的习惯是必要的,这几天在网上找了一些相关资料,反正多总结吧。
常量和变量的命名规格:
1) 在程序编程过程中,对于经常用到或者在程序测试过程中需要多次修改的常量,尽量做成宏定义的形式,方便修改和阅读,举例如下:
#define VER_MI 0x0f //AMCU 小版本号
#define Password02_addr 284 // 02 级密码地址 3bytes
#define Password04_addr 287 // 04 级密码地址 3bytes
建议:为了良好的区分变量与常量,常量在命名时尽量采用大写的形式;
2) 对于变量命名,必须表征变量的数据长度和变量的意义,其中局部变量建议全小写形式给出,全局变量大小写间隔的驼峰命名方式,在表征变量意义上面尽量选择该英文单词的几个关键字母,举例如下:
uint8 *DL645_1st68; //DL645规约第一个68指针
uint8 UC_DL645_Addr[6]; //DL645规约地址域A0-A1-A2------A5
uint8 UC_DL645_C; //DL645规约控制码C
uint8 UC_DL645_L; //DL645规约长度L
uint8 UC_RstMode_Time; //复位模块时间
建议:在变量第一次给出定义时,特别是关键变量最好给出变量的含义或者解释;
3) 对于具有函数的命名,同变量命名类似,区别是某函数一般都是固定完成某个任务或者事情,建议在命名时考虑动词+名词 大小写字母间隔的方式,其中中断函数前面建议加ISR关键字、初始化函数建议加Init关键字举例如下:
static voidISR_INF(void); //红外
通信
中断函数
static voidISR_PLC(void); //载波通信中断函数
void INF_Init(void); //红外通信初始化函数
void PLC_Init(void); //载波通信初始化函数
void Process_1S_Task(void);//1S 任务调度------典型的动词加名词形式命名
建议:在比较复杂的函数定义前加上该函数的接口参数、返回值、功能及调用注意事项;
其中在变量的数据长度定义时,可引用如下定义:
typedef unsigned char Uchar; //变量UC_XX/uc_xx 或者U8_XX/u8_xx
typedef unsigned int Uint; //变量 UI_XX/ui_xx 或者U16_XX/u16_xx
typedef unsigned long int ULint; //变量 UL_XX/ul_xx 或者U32_XX/u32_xx
typedef signed char Schar ; //变量SC_XX/sc_xx 或者S8_XX/s8_xx
typedef signed int Sint; //变量SI_XX/si_xx 或者S16_XX/s16_xx
typedef signed long int SLint; //变量 SL_XX/sl_xx 或者S32_XX/s32_xx
㈡
数据运算:
1) 对于运算优先级,建议在涉及到优先级选择的时候多加一些括号,避免优先级记忆不清楚而导致最后的结果出错;
2) 对于数据的乘法运算,需考虑数据溢出的问题,举例如下:
UI_NowTemp=300 * 500/100; //这样运算的结果是先算300 * 500=150000>65536
//所以会截取150000=0x249F0的低16位为 0x49F0,再用0x49F0=18928 除以100等于189;
UI_NowTemp=((uint32)300) * 500 /100; //这样书写后运算的结果就会使1500
很明显以上两种书写方式的运算结果截然不同,而且出错了也很隐蔽,所以在数据运算的时候需要特别注意数据溢出及中间结果的数据长度问题。
3)
对于
2
的整倍数乘法、除法运算,尽量使用移位操作来进行处理;
㈢
缓存区划分:
1) 对于缓存通信内容的数组缓存区,开辟缓存的时候需要留1—10字节的余量;
2) 对于存E2PROM的块数据,块数据下面分子数据项的话,最好子数据项留1—3字节预留扩展,数据块间留1—10字节地址间距,防止块间数据操作时意外覆盖其他块;
3) 需要频繁调用的E2PROM里面的数据,需额外开辟同等大小的数组来保持与E2PROM同步,因为在读取E2PROM的时候会使主循环运行周期时间加长;
4)缓存区的划分必须综合考虑MCU的RAM、程序功能和容错;
5)在填充数组数据时,必须检查填充数据的长度是否≤数组长度,避免数组溢出;
㈣
过程变量赋值:
1) 在编程过程中很多涉及到对某个过程(或进程)的描述,如状态1、状态2、状态3、状态4等,在给这些状态赋值时,尽量从0x01开始,递增赋值,且递增趋势必须与过程(或进程)的处理流程或者逻辑顺序相一致,举例如下:
uint8 UC_PowerWorkSta; //MCU
电源
的工作状态相关变量
#define POWER220V_OK 1 //220V 电源正常
#define POWER220V_3V 2 //220V 电源掉电---->向电池供电切换
#define POWER3V_SLEEP 3 // 电池供电切入休眠状态
#define POWER3V_WORK 4 //电池供电正常工作状态
#define POWER3V_220V 5 //电池供电向 220V 电源切换
2) 建议在定义这些状态变量的时候,在变量的下方直接标明该变量可能出现的几种值的宏定义,方便程序阅读;
㈤
正计时与倒计时
1) 已知时间的时候采用倒计时的方式比较好,未知的计时采用累加的方式,但累加必须考虑计数值的上限,必要的话需加容错保护;
㈥数组与指针等运用的取舍
1) 在申请块变量时,往往需要在数组与结构体中进行选择,优先考虑数组的形式,然 后数组的下标采用宏定义的方式给出,此时在赋值和RAM空间计算有点明显;
2) 在函数调用的过程中,指针和数组都是可以作为形参给出的,出于对操作和书写方便的考虑,可以优先考虑数组作为形参给出,此时数组的大小必须为空,这样操作和运用指针的形式都是耗用2字节(前提是8位MCU)的堆栈空间;
3) 申请的指针必须要有初始化流程,否则该指针指向的地址空间可能是任意的一个地址,这样对于程序的稳定性会存在隐患;
㈦程序排版
1) C语言的排版风格讲究对其,特别是“{”与“}”,好的排版可以让程序逻辑清晰、明了;
2) 在同一个子函数里面语意块之间最好要有一排空格隔开,这里所说的语意块可以理解为两个不用语意或者变量判定,但又从属于某个子函数的同一级逻辑;
3) 寄存器操作的底层与程序应用层之间的程序调用最好不要超过5级,否则跟硬件相关的参数查找及修改就显得比较困难,而且多级调用子函数也会增加堆栈的压力;
4) 子函数的局部参数最好不要超过100字节,至于main函数里面变量,可以的话也尽量放在”main.h”或者类似.h文件中声明;
5) If语句判断条件中尽量把常量放在前面,变量放在后面,如
If(1==uc_i)
编译后的结果应该优于
if(uc_i==1);
If(uc_i==(uc_k1+uc_k2+uc_k3)) 必须写成 If(u8_i==(Uchar)(uc_k1+uc_k2+uc_k3)),
至于这种判断语句,哪个放在前面比较适合,个人的意见是两者都可以,当然有经验的人欢迎指正。
㈧程序测试
1) 在作者自己编写程序进行底层模块测试的时候,每一个if逻辑的判断都必须保证, 毕竟交测试组的是程序的运行结果,而由于测试过程中某些条件的错误判断很难从 短期的结果中表现出来,所以编程作者在编写底层逻辑判断是必须创造条件自测每 一个逻辑判断语句的执行;
2) 串口打印相关参数适用于某些时间上不是很连续的事件,可以开辟测试数组,对可 能发生的流程中的每一个环节做标记,然后创造条件使这个流程再次发生,打印出 相关的测试数组的值,来锁定出哪一段程序块的问题;
3) 中间截断打桩测试适用于已经知道某段程序块存在问题;
最后,需要说明的是
因为做软件有时候是与硬件、开发平台版本相关联的,而且很多适合离职后可能还会涉及到维护问题,所以建议在每个工程的头部加上如下注释信息
:
/*====================================================
*ProjectName :
*IDE :
*HD/
PCB
No. :
*Description :
*SoftEdition :
*Author :
*LastWrTime :
=====================================================*/
声明:
本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:
https://www.wpsshop.cn/w/很楠不爱3/article/detail/536678
推荐阅读
article
黑屏
定屏
那些事 -
系统
机制
,
分析套路和实战(
系统
篇)_
android
黑屏
问题
分析...
本文发表于内核工匠公众号
,
旨在给内核开发的小伙伴分享:Android
系统
层面用户UI交互的设计
,
从而理解手机
黑屏
定屏
时背...
赞
踩
article
Linux
彻底删除Mysql5.7_
linux
卸载
mysql5.7
...
这样MySQL就删除完成了。_
linux
卸载
mysql5.7
linux
卸载
mysql5.7
...
赞
踩
article
使用
ESP
-01S与
阿里
云物
联网
平台
服务器的连接与配置(
温湿度
检测)_
uniapp
怎么连
阿里
云物
联网
...
这里
使用
了
阿里
云官方提供的SDK,所以我们只需要配置产品和设备的信息然后调用AliyunIoTSDK::begin(es...
赞
踩
article
git
上
clone
别人
的
项目
、
提交
代码
以及
更新
最新
代码
_
git
更新
本地
clone
...
1.
clone
项目
例如这是我们正要寻找
的
开源
项目
。首先要做
的
是fork
代码
到自己
的
库,点击右上角
的
fork按钮,之后这...
赞
踩
article
用
报废
耳机
自制
助听器
_蓝牙
耳机
改
助听器
方法...
本文通过图像和文字详细介绍了如何把一款
报废
的蓝牙
耳机
改
装成
助听器
的过程。_蓝牙
耳机
改
助听器
方法蓝牙
耳机
改
助听器
方法 ...
赞
踩
article
java
前后
端
分离,前
端
部署的方式_怎么在
java
项目本地启动前
端
页面
...
目前公司在开发web应用时,普遍采取的是
前后
端
分离的方式,将
前后
端
的开发人员开发代码分开,后台使用
java
语言,前
端
使用...
赞
踩
article
毕业设计
STM32
智能
安防
系统
(
项目
+论文)...
毕业设计
STM32
智能
安防
系统
(
项目
+论文) 文章目录 0...
赞
踩
article
LLama
大
模型
初体验——
Linux
服务器
部署
LLama
注意事项
_
ollama
linux
配置环境...
在
Linux
服务器
部署Llama
模型
的
注意事项
。_
ollama
linux
配置环境
ollama
linux
配置环境 ...
赞
踩
article
栈:如何实现
浏览
器
的前进和
后
退
功能
?_
当
用户
浏览
了
页
面
a
、
b
、
c
后
,
当
前
页
面
为
c
。若使用
浏览
器
后
退
功...
浏览
器
的前进
、
后
退
功能
,其实就是利用了栈的数据结构
当
我们依次访问一串
页
面
a-b-
c
,点击
浏览
器
的
后
退
按钮,就可以...
赞
踩
article
win10
+
python
3.6
下
安装
fastText
+
fastText
原理和
使用
_
python
3....
fastText
的
安装
1.
安装
fastText
1.1 报错:解决方法2.参考链接1.
安装
fastText
运行环境: ...
赞
踩
article
全景
AR
增强
监视
系统
对接
SkeyeIVMS
视频云管控
系统
实现
软硬件
资源
的健康状态管理(三)_skey...
全景
AR
增强
监视
系统
对接
SkeyeIVMS
视频云管控
系统
实现
软硬件
资源
的健康状态管理(三)1、写在前面前篇我们已经实现了...
赞
踩
article
ESP
-
01SWIFI
模块、
阿里
云IOT、
APP
inventor
实现物
联网
项目
...
借助
ESP
-
01SWIFI
模块、
阿里
云IOT、
APP
inventor
实现物
联网
项目
,本文即记录
项目
实现过程,其中参考多...
赞
踩
article
硬件
安全
技术——芯片
安全
设计
技术1_
fpga
sm4
gcm
实现
...
芯片
安全
设计
技术一、常见的对称算法二、常见的使用模式与场景三、常见的抗攻击
设计
四、对称密码算法
实现
一、常见的对称算法对称...
赞
踩
article
海康威视
isecure
center
综合
安防
管理平台任意文件上传
漏洞
_智能视频监控
漏洞
...
HIKVISION iSecure Center
综合
安防
管理平台是一套“集成化”、“智能化”的平台,通过接入视频监控、一...
赞
踩
article
IT
程序员
的
坏习惯
有
哪些
?
你中了吗
?
【纯
个人观点
,不喜绕道】...
IT
程序员
的
坏习惯
有
哪些
?
中了吗
?
有
一些
程序员
虽然工作了很多年,但工作表现就像刚入行
的
新人。但
有
些
程序员
拥
有
几年
的
工作经...
赞
踩
article
电子词典
dictionary
_
dictionary
电子版...
rock-bottom n.adj.(价格)最低(的)correspondent adj.对应的 n.记者。profes...
赞
踩
article
基于
YOLOV8
+
Pyqt5
无人机航拍太阳能电池板
检测
系统_
pyqt5
怎么导入
yolov8
...
本文基于YOLOv8深度学习框架,通过5000张图片,训练了一个进行航拍空间物体的目标
检测
模型,并基于此模型开发了一款带...
赞
踩
article
Hugging
face
的入门使用...
Hugging
Face 模型的使用入门_hugging
face
hugging
face
...
赞
踩
article
送
5
本新出版
ClickHouse
书籍
...
文末送书!导读:
ClickHouse
速度快的秘诀在于——利用存储引擎的特殊设计充分减少磁盘I/O对查询速度的影响。Cli...
赞
踩
article
SpringCloud
-
服务
熔断
,降级和
限流
_
customizer
(1)将
熔断
时间改为4S//
服务
熔断
和降级时间自定义配置@Bean(2)个性化
熔断
策略@Bean"slow"就是该
熔断
的...
赞
踩
相关标签
内核
android
java
面试
移动开发
linux
mysql
服务器
阿里云
物联网
c语言
git
clone
实时音视频
交互
驱动开发
自然语言处理
硬件工程
前后端分离
stm32
单片机
毕业设计
智能安防系统
llama
数据结构与算法