C语言代码注释必须用/**/ , 你没看错~

事情是这样的,有人离职,公司调我补缺。那个系统一直有个工程师在维护,参与该系统的新人来了又走,他始终泰然自若。刚过去一个礼拜,我就心下窃吼:“坑爹啊!”,也彻底体会到什么叫---绝对的权威、专家。该软件系统,是公司发家的支柱产品,涉及十几个国家x七八个机型,700 个文件 (C语言,所有.c .h档),十几万行代码,尽两百个跨模块全局变量,编译条件成百上千......(好吧,这是找借口、吐槽的节奏)。

尽管有名义上的交接,和几次和声细语的密切指导。但真正独立展开工作时,许多小功能增删改,我都要折腾个好几天才能厘清代码调用关系、算法原 理,然后找到修改点谨慎细微龟速前行。

进度追踪的人有的时候也催毛了,直接请专家大师出手,咔咔咔,不到半天就搞定了。当然,前期我当然尽量的”不耻上 问”,但人嘛,总是有遇到被激发“骨气”的时候。

这几天,好不容易搞好一个全新的功能模块,把代码推送给他合并编译。不曾想,出现了让我泣血的一幕。

我眼睁睁地、眼睁睁看着她把我辛苦敲入的代码注释/**/通通换成//,一份精美的代码,顿时成渣。

我询问缘由,她的回答是: 当代码里面充满注释符号/**/时,她想要用/**/注释整段代码时,就会很麻烦。

我理解了,因为/**/不支持嵌套。比如下面这样的语句是编译不过的。

1  /*
2  a = b c; /* 注释 */
3  */
4

我的手抬了抬,终究作罢。虽然我感觉到尊严被践踏,心爱的作品被蹂躏,但我还是开始反思。

许多软件规范、专家、有经验的工程,都建议或要求注释代码最好使用/**/,他们的理由大略如下:

1

"//"进行注释不够严谨

例如:

1 // 注释语句 ??/
2a = b c;

此时,a = b c在一些编译器不会被执行。

因为"??/"会被编译器当作 \,变成C语言的换行符。于是这段代码等同于// 注释语句 a = b c ;就会被注释掉。大家有兴趣的,不妨去搜索一下"C语言 三字母词"

当然,哪怕没有??/, 自己打盹碰到delete键也是会屏蔽掉a=b c的。

2

"//"的注释来源于C

有些早期的C编译器对这种注释是不支持的。代码要做到全平台兼容,这点是必须要考虑的。

因此,老外定义的C语言软件规范,无论是MISRA还是CMMI,一般都要求所有代码注释必须使用/**/。

君不见,那uCOS的最新版本源码,所有注释都是/**/。

君不见,那STM32的最新固件库,洋洋洒洒几十个文件,通篇皆没有用到//。

正是基于这样的理由,让我的心中充满了愠怒。但我仍然没有当场反驳她,因为这些理由还有些苍白无力。

1、当时,那个什么三字母词“??x”到底是什么我已经忘了,没法立刻做试验编译给她看,而且时候我里面做了编译实验,得到的是:

"filename.c", line xxxx: Warning: #2532-D: support for trigraphs is disabled xx代码语句xx // ??/

trigraph金山词霸---> [traigra:f]三字母词,看吧,编译器都警告了,默认是不支持的。

2、而且,所谓的//是C 的,早期的c编译器不支持。

这点谁鸟啊,我们只要现在,只用最新版本的编译器,所以,我还要继续思考,我要维护这个传统,为自己代言......

我开始思考,还有什么强劲有力的理由,来支持我恪守的真理:C语言代码注释必须使用/**/。

3

我的三大理解

倘若所有代码里面的注释用到/**/时,当你要注释掉这段代码时,如果不想忍受编译器的嵌套报警,又懒得把一个个/**/换成//的话。那么你还有如下选择。

1) 慎重思考下是否删光这段代码,如果还有些不舍,那就先"备份"(git推送)一下再删光。因此,

理由一:使用/**/注释代码,会使软件系统减少冗余的僵尸代码,鼓励程序员的程序备份行为。

2) 或者用编译条件圈起来,如下。

1#if (XXX_ENABLE)
2    func(a, b, c); /* 注释 */
3    ...... /* 注释 */
4#endif

那么你不得不考虑xxx的命名,如何更加一目了然,再写点注释什么的,表明对这段代码“弃而不舍”的缘由。因此,

理由二:使用/**/注释代码,会鼓励程序员删除代码时,三思而后行,并且注明舍弃的理由。

3) 当然,偷懒的人还是会用 #if 0 #endif圈起来, 如下,

1#if 0
2  func(a, b, c); /* 注释 */
3  ...... /* 注释 */
4#endif

而且不会写任何注释表明删除的理由。然而,“#if 0”是一个如此的醒目,很容易成为一个评估软件质量、工作绩效的搜索关键词。从管理的角度,这个是可以量化的。因此,

理由三: 使用/**/注释代码,有利于公司进行软件质量控管,对程序员绩效考核。

这三个理由,足够说服你么?

声明:

本文于网络整理,版权归原作者所有,如来源信息有误或侵犯权益,请联系我们删除或授权事宜。

86b172b66f88eb58f433f1a69a2731b6.png

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

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

相关文章

java8 streams_另一个Java 8 Lamdbas和Streams示例

java8 streams我一直落后于Java 8所关注的功能,因此在这篇文章中,我将简要介绍我对lambda和stream的初步经验。 和往常一样,我将专注于Podcast课程: package org.codingpedia.learning.java.core;import java.util.Comparator;p…

html文档的基本类型,HTML(网页的文档类型介绍)

一个html文件的第一行代码通常就是用于声明网页文档类型,其格式是:这一行不是属于标签文档类型:可以理解为不同的html版本!html4.0 或4.01版本基本固定,但又有分化:严格性:了用的标签和属性相对较少,但能兼容更多的浏览器。宽松型…

C语言源代码展示:常用转换函数实现原理

编程时经常用到进制转换、字符转换。比如软件界面输入的数字字符串,如何将字符串处理成数字呢?和大家分享一下。01字符串转十六进制代码实现:void StrToHex(char *pbDest, char *pbSrc, int nLen) {char h1,h2;char s1,s2;int i;for (i0; i …

jax-rs jax-ws_在JAX-RS中处理异步请求中的超时

jax-rs jax-wsJAX-RS 2.0在客户端和服务器端都支持异步编程范例。 这篇文章重点介绍了使用JAX-RS(2.0)API在服务器端执行异步REST请求时的超时功能 无需过多介绍,这里是一个快速概述。 为了以异步方式执行方法,您只需 需要指定A…

html5 移动 优化,第四天:HTML5移动站优化技巧 摘自《10天学会移动站SEO》

现在大家基本上做手机网站都是做成HTML5的,因为现在智能手机等移动设备越来越多,几乎全部支持HTML5,那么给网站适配上HTML5的网站就很是必要了。以前的WML网站已经淘汰,而最新的方式就这种最好。我们这一节就重点讲一讲HTML5移动网…

c语言中switch的用法是什么?

c语言中switch的用法是:功能:switch语句是多分支选择语句.用来实现多分支选择结构.if语句只有两个分支可供选择,而实际问题中常常要用到多分支的选择.例如,学生成绩分类(90为"A"等,80-89分为B等,70-90分为C等......).当然这些都可以用嵌套的if…

简述垃圾对象产生_使用零垃圾创建数百万个对象

简述垃圾对象产生如性能优化第一规则中所述,垃圾是快速代码的敌人。 通过使用垃圾收集器的服务,它不仅会破坏任何确定性的性能,而且我们开始用垃圾填充CPU高速缓存,这将导致程序的高速缓存未命中。 那么,我们可以在不…

光学模拟 Android,基于Android平台的光学字符识别应用的设计与实现

摘要:随着数字化时代的蓬勃发展,信息量以指数级的速度增长,然而手工录入并存储信息的速度远不及信息的产生速度.光学字符识别(OCR)技术能够自动化地检测信息并识别出来,有效地解决了信息录入速度和正确率的问题.目前,基于PC设备的光学字符识别已经被广泛的应用于办公…

C语言“fread”函数的用法?

C语言“fread”函数的用法为“size_tf read(void *buffer,size_t size,size_t count,FILE *stream)”,其作用是从一个文件流中读数据,读取count个元素,每个元素size字节。示例1#include #include #include int main(){ FILE *stream; c…

html怎么设置数据条的颜色,jQuery EasyUI 数据网格 – 条件设置行背景颜色 | 菜鸟教程...

jQuery EasyUI 数据网格 - 条件设置行背景颜色本教程将向您展示如何根据一些条件改变数据网格(datagrid)组件的行样式。当 listprice 值大于 50 时,我们将为该行设置不同的颜色。数据网格(datagrid)的 rowStyler 函数的设计目的是允许您自定义行样式。以下代码展示如…

C语言中for语句的执行过程是什么?

C语言中for语句的执行过程是:for语句的一般形式为:for(单次表达式;条件表达式;末尾循环体){中间循环体;}。for循环执行时,会先判断条件表达式是否成立,如果条件成立则执行中间循环体&#xff0c…

解耦,未解耦的区别_幂等与时间解耦之旅

解耦,未解耦的区别HTTP中的幂等性意味着相同的请求可以执行多次,效果与仅执行一次一样。 如果用新资源替换某个资源的当前状态,则无论您执行多少次,最终状态都将与您仅执行一次相同。 举一个更具体的例子:删除用户是幂等的&#x…

c语言getch()的用法是什么?

C语言中getch()函数功 能: 从stdio流中读字符,即从控制台读取一个字符,但不显示在屏幕上用 法:int getchar(void);这个函数是一个不回显函数,当用户按下某个字符时,函数自动读取,无需按回车,有的…

rx.observable_在Spring MVC流中使用rx-java Observable

rx.observableSpring MVC现在已经支持异步请求处理流程了一段时间,该支持内部利用了Tomcat / Jetty等容器的Servlet 3异步支持。 Spring Web Async支持 考虑一下需要花一点时间处理的服务呼叫,该服务呼叫具有延迟: public CompletableFutur…

淮安中专学计算机哪个学校好,2021淮安初中十强排名 哪些初中比较好

对于淮安的学生来说,了解淮安初中排名会更有利于选择初中。那么,2021淮安初中十强有哪些学校呢?下面小编整理了一些相关信息,供大家参考!2021淮安十大初中排名1、淮安兴隆中学2、淮安郑梁梅中学华禹分校3、淮安高堰九年制学校4、淮安长江路中…

C 隐式类型转换是什么?

C 隐式类类型转换《C Primer》中提到:“可以用 单个形参来调用 的构造函数定义了从 形参类型 到 该类类型 的一个隐式转换。”这里应该注意的是, “可以用单个形参进行调用” 并不是指构造函数只能有一个形参,而是它可以有多个形参&#xff0…

maven 插件未找到_防止在多模块Maven中找到“未找到插件”

maven 插件未找到在多模块Maven项目的子模块上定义Maven插件会给我们一个“未找到插件”错误。 特别是如果我们有一个多模块项目&#xff0c;并且只想在一个特定模块中应用Maven插件&#xff0c;则此错误会经常发生。 假设我们有一个看起来像这样的多模块root pom。 <proj…

文科女生单招学计算机,文科女生走单招学什么专业好

对于文科女生来说&#xff0c;想要走高职单招选择什么专业好呢?有哪些专业适合文科女生来学习呢?有途网小编为大家整理了一些专业。语言类专业对于高职单招的专业来说&#xff0c;如今的社会发展对于纯中文的专业并不看好&#xff0c;所以说如果文科女生想要学习语言类高职单…

工程师必备:C/C 单元测试万能插桩工具

研发效能是一个涉及面很广的话题&#xff0c;它涵盖了软件交付的整个生命周期&#xff0c;涉及产品、架构、开发、测试、运维&#xff0c;每个环节都可能影响顺畅、高质量地持续有效交付。在腾讯安全平台部实际研发与测试工作中我们发现&#xff0c;代码插桩隔离是单元测试工作…

html拖拽手势,h5实现手势操作放大缩小拖动等

最近开发遇到了这个需求&#xff0c;使用vue开发h5加一个手势放大缩小的功能&#xff0c;移动端的手势操作用原生的写法太麻烦&#xff0c;而且体验还不好&#xff0c;所以从github找到一个hammer.js的一个手势操作插件。官方文档地址&#xff1a;http://hammerjs.github.io/文…