|
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
因为"??/"会被编译器当作 \,变成C语言的换行符。于是这段代码等同于
5 T5 K5 G2 e- U3 n5 J/ S( \![]()
) M( W: H8 n' F, K就会被注释掉。大家有兴趣的,不妨去搜索一下"C语言 三字母词"
; 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
"filename.c", 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我要维护这个传统,为自己代言...... |
|