找回密码
 注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

巢课
电巢直播8月计划
查看: 6|回复: 0
打印 上一主题 下一主题

[硬件] 21ic编辑推荐:C代码注释引发的“血案”

[复制链接]

551

主题

1470

帖子

3万

积分

EDA365管理团队

Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9

积分
39487
跳转到指定楼层
1#
发表于 2019-9-27 15:09 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您!

您需要 登录 才可以下载或查看,没有帐号?注册

x
一线研发之声 之 C代码注释引发的“血案” <一>
0 X3 p8 x+ ^" D7 v" o
; M' f( p% X6 k# I) S& ?; K! D2 r
; A. X( ~) F( D% m" @我要无辜的坦白说,您遇到标题党了。$ X3 ]- x1 z: [$ L+ R& `4 T
* h- r3 e& B' a
/ ~8 F9 T8 ]& D2 ~2 J5 i- t  _
没有血案,但有些冲突。不是代码bug,我要讲注释风格。
8 X$ l+ c. S/ ^2 F; o' ?# R+ |8 X6 L* c6 e  \" l: d* N5 r

2 V4 Y2 F7 _  f这位看官,既然来了,且读且评吧。故事是真实的,如有雷同纯属巧合。
  C4 N! r& _" d" e- n0 `  \' l
  W- n) W  P% z, l+ d: A& I
7 A) U" j% k6 h0 j事情是这样的,有人离职,公司调我补缺。那个系统一直有个工程师在维护,参与该系统的新人来了又走,他始终泰若磐石。刚过去一个礼拜,我就心下窃吼:“TMD坑爹啊!”,也彻底体会到什么叫---绝对的权威、专家。该软件系统,是公司发家的支柱产品,涉及十几个国家x七八个机型,700+个文件(C语言,所有.c .h档),十几万行代码,尽两百个跨模块全局变量,编译条件成百上千......(好吧,这是找借口、吐槽的节奏)
3 C  f; Z+ E$ q9 }& w+ V
9 H3 d+ a; j+ Y& g/ g
% h7 G( o) C& @6 D. F- t尽管有名义上的交接,和几次和声细语的密切指导。但真正独立展开工作时,许多小功能增删改,我都要折腾个好几天才能厘清代码调用关系、算法原理,然后找到修改点谨慎细微龟速前行。进度追踪的人有的时候也催毛了,直接请专家大师出手,咔咔咔,不到半天就搞定了。当然,前期我当然尽量的”不耻上问”,但人吗,总是有遇到被激发“骨气”的时候。
# f) x- Q) P. H6 [, P( h5 y
. D& r+ ~0 p/ g7 ?  K  @; ]+ B0 ]2 e
( S0 ?8 H' s+ F1 y/ o0 N& B这几天,好不容易搞好一个全新的功能模块,把代码推送给他合并编译。不曾想,出现了让我泣血的一幕。
9 P- C4 v* N2 H% q8 D) j3 ?: F. E' L  F" s0 g4 K! q
2 W/ P' C4 N/ h
我眼睁睁地、眼睁睁看着她把我辛苦敲入的代码注释/**/通通换成//,一份精美的代码,顿时成渣。5 ^- H( x- A5 _( `
5 A# |+ z: [9 v# g

. l* _$ I* G  M* L% k0 V; w我询问缘由,她的回答是: 当代码里面充满注释符号/**/时,她想要用/**/注释整段代码时,就会很麻烦。 我理解了,因为/**/不支持嵌套。比如下面这样的语句是编译不过的。
. K8 o3 {* l6 Q7 v; [1 j- t- x1 t5 _+ I4 x- a( F
我的手抬了抬,终究作罢。虽然我感觉到尊严被践踏,心爱的作品被蹂躏,但我还是开始反思。
4 d. q. N9 B! r+ g4 o! Z许多软件规范、专家、有经验的工程,都建议或要求注释代码最好使用 /**/,他们的理由大略如下:% O6 P5 }! f9 A# B3 c1 b
1. “//” 的注释的严密性不够。 例如
) `) {7 p, p1 r! Z  g2 S2 ^* L4 ?( y  `+ F: O$ [6 d. K
此时,a = b+c在一些编译器不会被执行。: \4 u" T+ `0 v1 b6 w, Z, V- l- u
因为&quot;??/&quot;会被编译器当作 \,变成C语言的换行符。于是这段代码等同于
5 T5 K5 G2 e- U3 n5 J/ S( \
) M( W: H8 n' F, K就会被注释掉。大家有兴趣的,不妨去搜索一下&quot;C语言 三字母词&quot;
; K* c1 a9 D- f3 i, b* R( I: Y( U5 X当然,哪怕没有??/, 自己打盹碰到delete键也是会屏蔽掉a=b+c的3 |$ n& \* ^' k" Y+ O: `  R% N$ G# `
2. “//” 的注释,是C++发展后才引进的。 有些早期的C编译器对这种注释是不支持的。代码要做到全平台兼容,这点是必需要考虑的。
% m5 y" M2 W9 Z* J6 U# a. A因此,老外定义的C语言软件规范,无论是MISRA还是CMMI,一般都要求所有代码注释必须使用/**/。/ p" G% ]( `4 f
君不见,那uCOS的最新版本源码,所有注释都是/**/。
+ Z+ b1 X5 d; @君不见,那STM32的最新固件库,洋洋洒洒几十个文件,通篇皆没有用到//。
- b, ]5 v- l' ~! _+ E6 O! V正是基于这样的理由,让我的心中充满了愠怒。但我仍然没有当场反驳她,因为这些理由还有些苍白无力。
/ J9 @9 N% i! F7 L3 k; q! f1. 当时,那个什么三字母词“??x”到底是什么我已经忘了,没法立刻做试验编译给她看。+ d  S4 J" t% D
而且时候我里面作了编译实验,得到的是& G* ]# d: r4 c& a5 R4 m, Y) T* r
&quot;filename.c&quot;, line xxxx: Warning: #2532-D: support for trigraphs is disabled xx代码语句xx // ??/
3 o. [$ I, R6 h% [  ytrigraph金山词霸---> [traigra:f]三字母词& @. Q$ p+ u0 V* Z( W; ^8 r$ G
看吧,编译器都警告了,默认是不支持的。
/ `5 @2 i# f9 j9 k  {2. 而且,所谓的//是C++的,早期的c编译器不支持。
4 H) M8 f4 ]3 e" E$ R这点谁鸟啊,我们只要现在,只用最新版本的编译器。
. D+ ~+ ^1 j# ?6 u: s3 U所以,我还要继续思考。
- a" E& a8 t" X: r7 z我要维护这个传统,为自己代言......
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友 微信微信
收藏收藏 支持!支持! 反对!反对!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

推荐内容上一条 /1 下一条

巢课

技术风云榜

关于我们|手机版|EDA365 ( 粤ICP备18020198号 )

GMT+8, 2025-4-7 08:18 , Processed in 0.055938 second(s), 32 queries , Gzip On.

深圳市墨知创新科技有限公司

地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

快速回复 返回顶部 返回列表