EDA365电子工程师网

标题: 21ic编辑推荐:C代码注释引发的“血案” [打印本页]

作者: admin    时间: 2019-9-27 15:09
标题: 21ic编辑推荐:C代码注释引发的“血案”
一线研发之声 之 C代码注释引发的“血案” <一>
4 M! E0 v- ]7 b3 O$ y  x
4 {3 k  B9 K, b! t) j
6 q0 J$ v6 E1 b% {4 Z* i我要无辜的坦白说,您遇到标题党了。* A6 m8 s1 T: Z: ?/ N. O8 {

+ A" a0 r4 Z, `1 X: a
/ }8 ^1 G. ?6 m% T1 J没有血案,但有些冲突。不是代码bug,我要讲注释风格。
1 T  A7 ^9 `6 i$ E; \1 r9 j0 Y6 {  e# F- r7 _" ~
4 Y% r8 }. b. k% _2 ]
这位看官,既然来了,且读且评吧。故事是真实的,如有雷同纯属巧合。& e: s6 }) r0 j

7 o, P4 U! R* ]9 Z) b( L, V
/ J8 q# i8 A$ H事情是这样的,有人离职,公司调我补缺。那个系统一直有个工程师在维护,参与该系统的新人来了又走,他始终泰若磐石。刚过去一个礼拜,我就心下窃吼:“TMD坑爹啊!”,也彻底体会到什么叫---绝对的权威、专家。该软件系统,是公司发家的支柱产品,涉及十几个国家x七八个机型,700+个文件(C语言,所有.c .h档),十几万行代码,尽两百个跨模块全局变量,编译条件成百上千......(好吧,这是找借口、吐槽的节奏)
4 d* W/ U: M) i' H! @
; I$ j" @3 ~& N* ]; }* O; g& V4 i; ]) ?6 n# t
尽管有名义上的交接,和几次和声细语的密切指导。但真正独立展开工作时,许多小功能增删改,我都要折腾个好几天才能厘清代码调用关系、算法原理,然后找到修改点谨慎细微龟速前行。进度追踪的人有的时候也催毛了,直接请专家大师出手,咔咔咔,不到半天就搞定了。当然,前期我当然尽量的”不耻上问”,但人吗,总是有遇到被激发“骨气”的时候。
  V' A$ b3 M  K1 N6 X  R6 U2 c0 Y6 `
& z$ Q, @0 m; ^( K' V
这几天,好不容易搞好一个全新的功能模块,把代码推送给他合并编译。不曾想,出现了让我泣血的一幕。
) [$ t3 C3 z( F+ i6 H* f
( ]; m- Y' n3 O7 q/ f6 x4 E8 l3 K4 M  j4 F9 y; Z- Y
我眼睁睁地、眼睁睁看着她把我辛苦敲入的代码注释/**/通通换成//,一份精美的代码,顿时成渣。
8 ~' D! O0 O* C) I, L; H5 p
( l; {' x8 }5 A6 L" c
, W( G7 q: f% ]; T, {我询问缘由,她的回答是: 当代码里面充满注释符号/**/时,她想要用/**/注释整段代码时,就会很麻烦。 我理解了,因为/**/不支持嵌套。比如下面这样的语句是编译不过的。
8 R  a: w) ?* R$ ^, s1 F: e$ M8 d# Y* H
我的手抬了抬,终究作罢。虽然我感觉到尊严被践踏,心爱的作品被蹂躏,但我还是开始反思。
/ u' A( q' Y. H3 d9 h  z许多软件规范、专家、有经验的工程,都建议或要求注释代码最好使用 /**/,他们的理由大略如下:; z# d$ b; P5 z, F, g& n  y, R0 |  F
1. “//” 的注释的严密性不够。 例如
. w6 E/ z6 t2 `$ m  d3 C! ?/ ~' P1 {+ W: b
此时,a = b+c在一些编译器不会被执行。5 f+ g  N% G2 v
因为&quot;??/&quot;会被编译器当作 \,变成C语言的换行符。于是这段代码等同于1 y: `6 h: A6 o3 G$ i  k
% C1 T# [: c/ g% H  `
就会被注释掉。大家有兴趣的,不妨去搜索一下&quot;C语言 三字母词&quot;4 ~; @2 H* t: T6 y: O3 l
当然,哪怕没有??/, 自己打盹碰到delete键也是会屏蔽掉a=b+c的' ?& O3 C, {7 t" T) p* `& o1 b
2. “//” 的注释,是C++发展后才引进的。 有些早期的C编译器对这种注释是不支持的。代码要做到全平台兼容,这点是必需要考虑的。/ {5 G# U3 a: G! Q: g; X' }
因此,老外定义的C语言软件规范,无论是MISRA还是CMMI,一般都要求所有代码注释必须使用/**/。: K2 U$ G! N, g' q  d8 z2 s
君不见,那uCOS的最新版本源码,所有注释都是/**/。
+ T5 Z( n( a8 P! r* E. ^君不见,那STM32的最新固件库,洋洋洒洒几十个文件,通篇皆没有用到//。
4 ]/ w9 v! U9 A& A# t) c7 \4 v正是基于这样的理由,让我的心中充满了愠怒。但我仍然没有当场反驳她,因为这些理由还有些苍白无力。
( M5 K6 ~5 Q2 Y6 M" g' u1. 当时,那个什么三字母词“??x”到底是什么我已经忘了,没法立刻做试验编译给她看。/ {( P' T. N5 N- B/ \" g* N& e
而且时候我里面作了编译实验,得到的是
$ g) V% `7 j4 s  Q&quot;filename.c&quot;, line xxxx: Warning: #2532-D: support for trigraphs is disabled xx代码语句xx // ??/
9 M8 {$ I* X3 ~5 q  U) Ytrigraph金山词霸---> [traigra:f]三字母词
+ Y6 m* v0 Q2 v* {4 V% _# k8 `; F看吧,编译器都警告了,默认是不支持的。
8 ~7 m1 c* L4 z, K/ M% w2. 而且,所谓的//是C++的,早期的c编译器不支持。
+ A5 z$ y: d1 c, u这点谁鸟啊,我们只要现在,只用最新版本的编译器。4 Y% w: w. g* Z) M2 N4 p; s4 @  `
所以,我还要继续思考。) W+ T8 u3 @2 H
我要维护这个传统,为自己代言......




欢迎光临 EDA365电子工程师网 (http://bbs.elecnest.cn/) Powered by Discuz! X3.2