0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

关于代码的保养

strongerHuang 来源:嵌入式系统 作者:嵌入式系统 2022-07-08 09:38 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

不止女人要保养,代码也是如此。面向对象编程,就是把面对的代码当作对象一样,定期对其进行保养。

目录

一、美颜 Astyle+Source Insight

二、祛痘 cppCheck

三、返老还童 git

四、工欲善其事必先利其器

一、美颜 Astyle+Source Insight

1.1真假小龙女的问题

都说秀色可餐,同样的角色,都是小龙女,但是效果不一样。实现同样的功能,有的代码一目了然,像诗一样赏心悦目;有的却像SHI一样,如下面的代码,虽然功能正常,但看起来什么感觉?

//C语言混乱大赛作品
#include
main(intt,int_,char*a)
{
return!03?main(-79,-13,a+main(-87,1-_,
main(-86,0,a+1)+a)):1,t<_?main(t+1,_,a):3,main(-94,-27+t,a)&&t==2?_<13?
main(2,_+1,"%s%d%d
"):9:16:t<0?t<-72?main(_,t,
"@n'+,#'/*{}w+/w#cdnr/+,{}r/*de}+,/*{*+,/w{%+,/w#q#n+,/#{l+,/n{n+,/+#n+,/#;#q#n+,/+k#;*+,/'r:'d*'3,}{w+Kw'K:'+}e#';dq#'lq#'+d'K#!/+k#;q#'r}eKK#}w'r}eKK{nl]'/#;#q#n'){)#}w'){){nl]'/+#n';d}rw'i;#){nl]!/n{n#';r{#w'rnc{nl]'/#{l,+'K{rw'iK{;[{nl]'/w#q#n'wknw'iwk{KK{nl]!/w{%'l##w#'i;:{nl]'/*{q#'ld;r'}{nlwb!/*de}'c;;{nl'-{}rw]'/+,}##'*}#nc,',#nw]'/+kd'+e}+;#'rdq#w!nr'/')}+}{rl#'{n'')#}'+}##(!!/")
:t<-50?_==*a?putchar(a[31]):main(-65,_,a+1):main((*a=='/')+t,_,a+1)
:02,2,"%s"):*a=='/'||main(0,main(-61,*a,
"!ek;dci@bK'(q)-[w]*%n+r3#l,{}:
uwloca-O;m.vpbks,fxntdCeghiry"),a+1);
}

正如女人爱美一样,出门必化妆,拍照必美颜;代码也是需要美颜妆扮,除非你期望后来接手者在心中的十万个诅咒,这TM谁写的?尤其对嵌入式系统产品,升级维护周期长,软件的可读性就显得更加重要;代码规范对后续维护升级是大有裨益的。

1.2 代码格式化

一般公司不缺编码规范,缺的是执行。小项目单人完成,编码风格随心所欲;大项目团队完成,编码风格各不相同。目前来说,个人只发现go语言是编译时强制格式化,其他语言编译时,不检查排版格式。对于编码规范,不能依靠个人主观,强推工具自动实现才能提高执行力。

不管编码使用Keil/MDK、Qt等集成工具,或者纯粹的代码编辑工具Source Insight,一般都支持自定义运行可执行文件,如Astyle。可以客制化新菜单,一键执行Astyle,将代码一键格式化,排版统一、层次分明。

Astyle官网 http://astyle.sourceforge.net/ 按要求下载安装,只需要AStyle.exe即可。关于其使用和参数,可以在进入Documentation。对代码基本风格,{}如何对齐、是否换行,switch-case如何排版,tab键占位宽度,运算符或变量前后的空格等等,基本上代码排版涉及的方方面面都有参数说明。个人选择的编码参数是

--style=allman-S-U-t-n-K-p-s4-j-q-Y-xW-xVfileName

效果如下

intFoo(boolisBar)
{
if(isBar)
{
bar();
return1;
}
else
{
return0;
}
}

建议先参考文档逐个熟悉作用,确认参数,然后集成到编辑工具,以Source Insight为例。

1、在选项或者工具下(不同Source Insight版本不同)打开“自定义命令”,添加命令和运行。

61f72462-fe56-11ec-ba43-dac502259ad0.png



2、选择正确的路径,结合前面的参数类型,最后必须加上 %f,表示对该文件执行,

C:AStyle.exe --style=allman -S -U -t -n -K -p -s4 -j -q -Y -xW -xV %f

620ae556-fe56-11ec-ba43-dac502259ad0.png



3、将该命令插入到编辑菜单,后续在编辑栏点击Astyle,即可对当前文件自动进行格式化排版。

1.3 高级配置

前面只是Source Insight的基础扩展,下面简要说明下高级扩展宏功能,本文只是描述下基本流程。1、配置菜单

621ddaf8-fe56-11ec-ba43-dac502259ad0.png



2、插入之后,在主菜单栏会出现“工作”的菜单,点击Insertifdef,弹出如下对话框

622aee28-fe56-11ec-ba43-dac502259ad0.png



3、确定之后自动在光标处插入代码

#ifdefined(ABCD)

#endif/*ABCD*/

4、不止是支持插入if defined ,还包括插入文件头,对h文件插入避免多次包含的宏,对函数插入注释,以及自动添加编辑时间、作者名称等。这些宏配置和前面一样,至于客制化,比如函数注释的内容、格式等,也是可以自由定义。5、配置路径如下

6244604c-fe56-11ec-ba43-dac502259ad0.png



先关闭全部Source Insight工程,再打开Base.PR,编辑utils.em。如前面的宏 Insertifdef就是如下的代码

macroInsertIfdef()
{
sz=Ask("Enterifdefcondition:")
if(sz!="")
IfdefSz(sz);
}

//Wrapifdef..endifaroundthecurrentselection
macroIfdefSz(sz)
{
hwnd=GetCurrentWnd()
lnFirst=GetWndSelLnFirst(hwnd)
lnLast=GetWndSelLnLast(hwnd)

hbuf=GetCurrentBuf()
InsBufLine(hbuf,lnFirst,"#ifdefined(@sz@)")
InsBufLine(hbuf,lnLast+2,"#endif/*@sz@*/")
}

如Ask就是弹出提示语,sz获取输入的内容,再InsBufLine插入两行代码。而这些接口的使用说明,只要打开Source Insight的帮助即可查看。

6253b790-fe56-11ec-ba43-dac502259ad0.png


Ask说明:

626d29f0-fe56-11ec-ba43-dac502259ad0.png


例如插入函数注释的代码如下:

szInf=Ask("你为什么要编写这个函数:")
szDescription=Ask("请输入函数的使用注意事项和算法实现:")
//beginassemblingthetitlestring
sz="/******************************************************************************"
InsBufLine(hbuf,ln,sz)
InsBufLine(hbuf,ln+1,"*Function-@szFunc@")
InsBufLine(hbuf,ln+2,"*")
InsBufLine(hbuf,ln+3,"*Purpose-@szInf@")
InsBufLine(hbuf,ln+4,"*")
InsBufLine(hbuf,ln+5,"*Description-@szDescription@")
InsBufLine(hbuf,ln+6,"*")
InsBufLine(hbuf,ln+7,"*modificationhistory")
InsBufLine(hbuf,ln+8,"*----------------------------------------")
InsBufLine(hbuf,ln+9,"*v1.0,@szDay@-@szMonth@-@Year@,@szMyName@written")
InsBufLine(hbuf,ln+10,"*----------------------------------------")
InsBufLine(hbuf,ln+11,"******************************************************************************/")

最终自动插入的函数注释显示效果如下:

/******************************************************************************
*Function-[myFunction]
*
*Purpose-
*
*Description-[函数的功能]
*
*modificationhistory
*----------------------------------------
*v1.0,22-11-2020,embedded-systemwritten[时间格式可自由设定]
*----------------------------------------
*******************************************************************************/

6、其他宏也是这样,可以自由配置,当然,开启这个功能的第一步是先编辑,替换全部szMyName为自己的名字。有一点需要注意的是插入函数注释时,光标必须在该函数第一个{内,否则无法获取函数名,会提示错误。

1.4 总结

Source Insight集成Astyle自动排版,统一风格;集成宏定义,统一注释格式、提高效率。

二、祛痘 cppCheck

2.1 祛痘除隐患

依靠美颜可以掩盖面部瑕疵,如痘痘,但为了极致,应该从根源祛痘,素颜就美,淡妆浓抹总相宜。代码规范整齐,还要没有隐患,大部分开发人员都对警告视而不见,觉得隐患没啥大问题,

627e491a-fe56-11ec-ba43-dac502259ad0.jpg



同样的美女,若是一脸痘痘,颜值瞬间下降。代码也是如此,编译警告如同痘痘,看起来不碍事,实际对代码的质量和后期维护都是隐患,要培养习惯,凡是警告都要消灭的习惯。

另外对于编码规范,不只是排版布局,还有命名规范,例如宏定义使用小写字母,就必须指出要求修改。所以,代码必须经过祛痘,除去小隐患,严苛的要求,造就趋于完美的代码。但是,依靠人工检查效率低下,静态扫描顺便检查命名规范的神器应运而生。

代码的静态检测工具有很多,为什么推荐cppCheck?因为它是Qt实现且开源。作为嵌入式软件开发,Qt可以锦上添花,它本身可以多平台运行,平时使用它开发小工具,模拟验证部分代码,比起在真机编译下载调试快捷方便。

cppCheck官网http://cppcheck.net/,可以下载执行文件和源码,稍微有Qt基础的,可以下载源码,其Qt工程如下,可以根据自身要求和能力,进行二次开发。

6299f9d0-fe56-11ec-ba43-dac502259ad0.png



实现代码自动格式化和静态分析,可以有效规避软件风险。基于开源的Cppcheck,集成Astyle,结合实际开发平台和编码标准,使用Qt集成的codeCheck诞生了。

codeCheck执行的流程,先将C语言代码自动格式化,按指定的规则排版对齐,调整代码间空格和间距,特殊语句强制换行或添加括号等,简单操作即可完成代码格式统一化(也就是上一章的配置参数)。然后拆分代码字符,建立token数据库,按预置的规则分析代码是否存在匹配的非法代码,并直观显示风险代码位置以便跟踪修复。codeCheck不具备编译语法分析,因此导入的文件必先确保编译正常,再进行分析才有意义。

针对实际开发中的问题点,比如变量命名冲突,或者关键变量缺少注释导致维护升级困难,特别增加了个性化扫描标准。由于个人时间和水平有限,工具还存在优化改进的必要,但基本可满足常规应用和新人培养。

即使没有Qt基础,直接使用开源版本,也是相当给力的,二次开发只是锦上添花而已。

2.2 代码扫描与静态分析

个人二次开发后的主界面如下,和原始的cppcheck差不多,只是多了命名规范检查(全局变量必须g_开头,带注释;宏定义、枚举值禁止包含小写字母等)。

62a8e396-fe56-11ec-ba43-dac502259ad0.png



“分析”导入文件或文件夹后,即可启动自动格式化并分析代码逻辑,显示结果如下:

62c96012-fe56-11ec-ba43-dac502259ad0.png



选择“分析结果”栏,则显示扫描出的风险代码,标明风险类型和代码位置,具体显示如下图。

62d4d294-fe56-11ec-ba43-dac502259ad0.png

62e7c8c2-fe56-11ec-ba43-dac502259ad0.jpg


2.3 源码分析

非cppcheck源码,二次开发的代码片段。

voidCheckThread::run()//运行扫描,这里是入口
{
/**/
QStringfile=mResult.getNextFile();
while(!file.isEmpty()&&mState==Running)
{
qDebug()<< "formatfile"<< file;
        file_format(file);//添加Astyle命令
mCppcheck.check(file.toStdString());
/**/
}
/**/
//astyle.exev3.1添加代码格式化
voidCheckThread::file_format(constQStringfile)
{
QProcessbuilder;
QStringListparam;

param<<"--style=allman"<<"-S"<<"-U"<<"-t"<<"-n"<<"-K"<<"-p"<<"-s4"<<"-j"<<"-q"
<<"-Y"<<"-xW"<<"-xV"<if(file.endsWith(".c",Qt::CaseSensitive)||file.endsWith(".cpp",Qt::CaseSensitive)
||file.endsWith(".h",Qt::CaseSensitive))
{
builder.start("codeFormat.exe",param);
builder.waitForFinished();
}
}

三、返老还童 git

3.1 月光宝盒



爱情不可期,往事成追忆。至尊宝可以使用月光宝盒穿越时空去寻找爱情。对于女人,拥有月光宝盒,即使容颜衰老,也可以回到过去,返老还童,永葆青春。

对于程序员,一份完美的代码,修修补补,几经折腾终于封板;因为保存不善或者修改记录丢失,那种痛苦也是一般人无法想象的。为了不会有失去才后悔莫急的痛楚,必须使用版本控制来追溯代码的过去,程序员的月光宝盒就是Git神器。

3.2 版本控制git

不必说你有多聪明,每天拷贝一份代码加描述备份;也不要说以往的svn等工具有多先进;这些工具在git的分布式软件版本控制面前,都不值一提,虽然Git也有缺点,但是依然不能掩盖它的光芒。

十年来,一直是嵌入式软件开发,80%的时间使用windows版的git可视化操作,相比命令行,更容易掌握与使用,查看版本记录也更加直观,命令行的操作方式不在本文考虑范围。git官网https://git-scm.com/。

1、安装TortoiseGit-2.5.0.0-64bit.msi 一路下一步,这只是安装了git的内核功能,要在windows下操作,需要安装界面外壳。

2、安装GitExtensions-2.50.02-SetupComplete.msi 或者 Git-2.15.0-64-bit.exe,这是两种风格的界面,主体功能差不多,个人选择的是后者。也可以两个都安装。

3、安装过程中出现较多的配置,所有选项中,全部都选带windows关键字的,否则用起来看不出问题,但是保存的记录异常。

既然是界面操作,就开启鼠标右键的快捷图标。

6313d3d6-fe56-11ec-ba43-dac502259ad0.png


后续一些安装选项,全部选带windows关键字的。

63246e12-fe56-11ec-ba43-dac502259ad0.png

4、安装完成后,鼠标右键,会出现 Git GUI Here。

633b79c2-fe56-11ec-ba43-dac502259ad0.png

5、如果是新手可安装汉化补丁TortoiseGit-LanguagePack-2.5.0.0-64bit-zh_CN.msi,建议不要安装,翻译有点搞笑(rebase-变基)。

3.3 基础演示

1、配置

63461f76-fe56-11ec-ba43-dac502259ad0.jpg

2、创建本地版本库,git creat repository here,默认操作,即可创建版本,会在test空文件夹下生成.git 。

3、在test下随便改动,如新加123.txt,提交改动。此时鼠标右键

635e5eba-fe56-11ec-ba43-dac502259ad0.png

636b0048-fe56-11ec-ba43-dac502259ad0.png

4、保存本次修改后,使用Git GUI Here->Repository->Visualize master's History查看全部版本记录。

638a970a-fe56-11ec-ba43-dac502259ad0.png

5、通用配置和常用功能

63ae087a-fe56-11ec-ba43-dac502259ad0.png

3.4 总结

Git的使用尤其是多人合作,注意以下几点:

1、推送服务器前先同步;

2、2个分支版本有冲突,先rebase解决;熟练操作前不要使用merge;

3、版本节点不能使用中文,修改描述可以;

4、编译自动生成的不要提交,可以使用TortoiseGit-->Delete and add in ignore list,滤指定的文件,即使有改动也不提交;

5、Git自带的比较工具比较差,可以配置使用外部比较工具。

63c3a31a-fe56-11ec-ba43-dac502259ad0.png

一共三处,将Diff viewer和Merge Tool改为HA-BCompare。这个工具的比较功能强大,显示界面清晰。

四、工欲善其事必先利其器

工欲善其事必先利其器,工具的熟练掌握、合理利用。代码规范化,静态扫描排除风险,修改记录保存完整,如此,才能保证代码的质量。

审核编辑 :李倩



声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 代码
    +关注

    关注

    30

    文章

    4976

    浏览量

    74376

原文标题:代码的保养

文章出处:【微信号:strongerHuang,微信公众号:strongerHuang】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    温湿高试验箱维修保养:让环境模拟专家永葆精准的全周期健康管理

    温湿度试验箱(又称恒温恒湿试验箱、交变湿热箱、高低温湿热试验箱等)的维修保养对于确保其长期稳定运行、延长使用寿命及保证试验数据准确性至关重要。为什么维修保养如此重要?温湿高试验箱是高精度环境模拟
    的头像 发表于 04-21 14:18 68次阅读
    温湿高试验箱维修<b class='flag-5'>保养</b>:让环境模拟专家永葆精准的全周期健康管理

    STM32N6 在 PSRAM 上运行代码的调试

    开发其产品过程中,使用了 STM32N657X0H3Q。客户的代码很大,不能放在SRAM 上运行,想放在 PSRAM 上去运行,并咨询如何在 STM32CubeIDE 上进行调试。2.2. 重现问题关于如何将用户代码放置在 PS
    发表于 04-15 16:02 0次下载

    冻雨试验箱维修保养全攻略

    稳定运行和试验精度,需制定科学的维修保养方案。其维修保养需结合制冷系统、降水系统、电气控制及环境模拟的特殊性,确保设备长期稳定运行和试验数据准确性。冻雨试验箱(也
    的头像 发表于 04-14 14:45 166次阅读
    冻雨试验箱维修<b class='flag-5'>保养</b>全攻略

    高低温低气压试验箱维修保养:守护“天空实验室”全周期健康管理

    高低温低气压试验箱的维修保养需遵循定期清洁、关键部件检查、系统校准与专业维护相结合的原则,以确保设备性能稳定、测试数据准确‌。科学的维保不仅能延长设备寿命,还能避免因故障导致的测试中断
    的头像 发表于 04-08 14:28 105次阅读
    高低温低气压试验箱维修<b class='flag-5'>保养</b>:守护“天空实验室”全周期健康管理

    老化试验箱维修保养:让“时间加速器”永葆精准的全周期健康管理

    老化试验箱(如高温老化箱、恒温恒湿老化箱、紫外老化箱等)是用于评估材料、电子元器件、产品在长期热、湿、光等应力下性能稳定性的关键设备。为确保其精度、寿命与试验可靠性,需定期进行专业维修保养
    的头像 发表于 03-24 14:45 154次阅读
    老化试验箱维修<b class='flag-5'>保养</b>:让“时间加速器”永葆精准的全周期健康管理

    HarmonyOS应用代码混淆技术方案

    代码混淆技术可以增加代码的复杂性和模糊性,从而提高攻击者分析代码的难度。
    的头像 发表于 11-21 16:17 5732次阅读
    HarmonyOS应用<b class='flag-5'>代码</b>混淆技术方案

    代码开发平台推荐:2025国内低代码开发平台排名TOP10

    代码开发平台排行榜 在企业数字化转型的浪潮中,低代码开发平台正逐渐成为企业实现高效开发和快速迭代的重要工具。随着技术的不断进步和市场需求的持续增长,低代码开发平台的市场竞争也日益激烈。以下
    的头像 发表于 10-28 10:22 946次阅读

    基于代码的PCB设计工具对传统EDA的挑战

    “  一直想写一些关于新的设计范式(不只是 AI)的内容,但迟迟没有动笔(主要我自己也无法说服自己该怎么选)。其实用代码来进行电子设计在海外并不是什么新的概念,JITX 的商业化已运作了几年,YC
    的头像 发表于 08-13 11:14 7585次阅读
    基于<b class='flag-5'>代码</b>的PCB设计工具对传统EDA的挑战

    手机气密性检测设备的维护与保养指南

    手机气密性检测设备在手机生产与质量检测环节中起着关键作用,能有效保障手机的防水防尘性能。为确保其稳定运行和检测结果的准确性,合理的维护与保养必不可少。(1)日常清洁设备的日常清洁是基础保养工作。每次
    的头像 发表于 07-07 11:14 882次阅读
    手机气密性检测设备的维护与<b class='flag-5'>保养</b>指南

    STM32IDE如何设定代码到ITCM中运行?

    近期使用STM32MUX生成STM32IDE的代码(MCU是STM32H743),目前希望可以将部分代码定位到ITCM中运行,加快处理速度,关于代码中的.id链接文件,该部分资料比较少
    发表于 06-24 06:45

    波峰焊设备的维护和保养方法

    波峰焊设备作为电子制造的关键设备,其性能的稳定与否直接影响焊接质量和生产效率。深圳市晋力达设备的波峰焊凭借诸多优势,在保障焊接效果的同时,也为设备维护保养带来便利。做好设备的维护与保养工作,不仅
    的头像 发表于 06-17 17:03 1773次阅读

    三维表面轮廓仪的维护保养是确保其长期稳定运行的关键

    三维表面轮廓仪是一种高精度测量设备,用于非接触式或接触式测量物体表面的三维形貌、粗糙度、台阶高度、纹理特征等参数。维护保养对于保持其高精度测量能力至关重要。
    发表于 05-21 14:53 0次下载

    超声波清洗机保养与使用注意事项

    你是否曾经在使用超声波清洗机时,发现它的清洗效果没有想象中的理想,或者使用一段时间后就出现了故障?其实,很多问题的根源就在于我们对超声波清洗机的保养与使用不当。就像一辆汽车,定期的保养和合理使用才能
    的头像 发表于 05-12 16:20 1767次阅读
    超声波清洗机<b class='flag-5'>保养</b>与使用注意事项

    如何保养红外热像仪

    红外热像仪作为一种高科技、高精密的检测计量设备,广泛应用于工业检测、建筑诊断、安防监控等多个领域。为了确保其长期稳定运行和精准测量,正确的保养方法至关重要。今天,小菲就来跟大家聊聊如何保养红外热像仪。
    的头像 发表于 05-10 09:23 1436次阅读

    OLED代码分享

    OLED代码
    发表于 04-29 17:04 2次下载