為了提高源程序的質(zhì)量和可維護性,從而最終提高軟件產(chǎn)品生產(chǎn)力,,特編寫此規(guī)范,。本標(biāo)準(zhǔn)規(guī)定了程序設(shè)計人員進行程序設(shè)計時必須遵循的規(guī)范。本規(guī)范主要針對單片機編程語言和08編譯器而言,,包括排版,、注釋、命名,、變量使用,、代碼可測性、程序效率,、質(zhì)量保證等內(nèi)容,。
7 @4 a |# F% d+ r1.基本規(guī)則 1 f6 ^; l2 d! r' c: N
格式清晰、注釋簡明扼要,、命名規(guī)范易懂,、函數(shù)模塊化、程序易讀易維護,、功能準(zhǔn)確實現(xiàn),、代碼空間效率和時間效率高、適度的可擴展性,、單片機編程規(guī)范-標(biāo)識符命名
6 l3 r6 m% ~' g" P+ l# G2.標(biāo)識符命名 2.1 命名基本原則 5 f" \6 u) H3 Y
(1)命名清晰明了,,有明確含義,使用完整單詞或約定俗成的縮寫,。通常,,較短的單詞可通過去掉元音字母形成縮寫,;較長的單詞可取單詞的頭幾個字母形成縮寫,。即"見名知意"。(2)命名風(fēng)格要自始至終保持一致,。 6 C' \1 l. U3 ?- p0 z; L! S1 N
(3)命名中若使用特殊約定或縮寫,,要有注釋說明。5 P3 s8 O# l0 p* Q: n
(4)同一軟件產(chǎn)品內(nèi)模塊之間接口部分的標(biāo)識符名稱之前加上模塊標(biāo)識,。9 K j3 ]6 x) M
2.2 宏和常量命名 / s. K6 }: i- E+ P U$ v/ V$ q5 Z0 f$ A
宏和常量用全部大寫字母來命名,,詞與詞之間用下劃線分隔,。對程序中用到的數(shù)字均應(yīng)用有意義的枚舉或宏來代替。
8 O. a1 [; {6 `" K2.3 變量命名
) a2 W8 a4 b+ T7 |& j/ Q變量名用小寫字母命名,,每個詞的第一個字母大寫,。類型前綴(u8\s8 etc.)全局變量另加前綴g_。9 X5 U' t+ W, k+ _& \8 t, x. G) t! z. q
局部變量應(yīng)簡明扼要,。局部循環(huán)體控制變量優(yōu)先使用i,、j、k等,;局部長度變量優(yōu)先使用len,、num等;臨時中間變量優(yōu)先使用temp,、tmp等,。
s5 P/ c7 I1 S2.4 函數(shù)命名 2 ]* P# O$ B, e0 u
函數(shù)名用小寫字母命名,每個詞的第一個字母大寫,,并將模塊標(biāo)識加在最前面,。( Z$ m! l( k9 X
2.5 文件命名
' f. a# B t& [# Z0 ?一個文件包含一類功能或一個模塊的所有函數(shù),文件名稱應(yīng)清楚表明其功能或性質(zhì),。1 U: ]) N5 ], g2 M
每個.c文件應(yīng)該有一個同名的.h文件作為頭文件,。
, Y! k Y5 U, \7 O3.注釋 3.1 注釋基本原則
# X8 G$ \7 v5 g5 j( p7 o有助于對程序的閱讀理解,說明程序在"做什么",,解釋代碼的目的,、功能和采用的方法。
& e& `7 v% A0 k+ U) |4 R/ H2 |! d一般情況源程序有效注釋量在30%左右,。
) j6 h$ B2 H- D) e注釋語言必須準(zhǔn)確,、易懂、簡潔,。
2 x& K" q# g$ k. L邊寫代碼邊注釋,,修改代碼同時修改相應(yīng)的注釋,不再有用的注釋要刪除,。. m y1 i9 c D( P- ?
匯編和C中都用"//",,取消";" 不使用段注釋" /* */ "(調(diào)試時可用) [+ e3 ?4 \5 |9 I1 z
3.2 文件注釋
6 _& t5 D7 p9 |, g$ H文件注釋必須說明文件名、函數(shù)功能,、創(chuàng)建人,、創(chuàng)建日期,、版本信息等相關(guān)信息。- b) U) A& \* ?1 S5 x+ A8 i/ y$ M
修改文件代碼時,應(yīng)在文件注釋中記錄修改日期,、修改人員,,并簡要說明此次修改的目的,。所有修改記錄必須保持完整。
: g! ~; I( D, K! n: P. S3 i @6 x7 N: N文件注釋放在文件頂端,,用"/*……*/"格式包含。
9 f% B" n }# B. }7 `# i" F注釋文本每行縮進4個空格,;每個注釋文本分項名稱應(yīng)對齊,。 ?* k0 A/ a0 E+ k% A
/***********************************************************
' W: U! B, Q H0 `, {文件名稱:
; h" w8 n0 }3 j作 者:* \$ a) U: q! k) }9 h" I
版 本:
9 f0 X5 f# S9 J: P- s- V, _說 明:, U$ j q% r- B# L
修改記錄:
( e7 r4 Y, ?* x# m) N***********************************************************/( K; d8 z# l5 a+ d6 _
3.3 函數(shù)注釋
/ [$ X# G4 @ c, B, d+ y. {& h3.3.1 函數(shù)頭部注釋
! K! S; P+ @; }函數(shù)頭部注釋應(yīng)包括函數(shù)名稱、函數(shù)功能,、入口參數(shù),、出口參數(shù)等內(nèi)容。如有必要還可增加作者,、創(chuàng)建日期,、修改記錄(備注)等相關(guān)項目。; ?/ F9 g) y1 B: \$ j, U7 T
函數(shù)頭部注釋放在每個函數(shù)的頂端,,用"/*……*/"的格式包含,。其中函數(shù)名稱應(yīng)簡寫為Name(),不加入,、出口參數(shù)等信息,。8 c5 o$ C! Y. q
/***********************************************************7 c$ ?, K: P: J% s9 M
函數(shù)名稱:) l9 N/ s4 Q: ?1 U2 L6 R
函數(shù)功能:& K4 k" n. A# ]1 h
入口參數(shù):
$ }4 F$ l7 C: m7 o& {' ]出口參數(shù):3 }' b p$ W4 e* ?3 [6 h$ e
備 注:* I8 X8 k3 Y8 M. r @
***********************************************************/
. e3 ^1 K+ z# E9 M3 U5 K3.3.2 代碼注釋
5 X& A$ p4 j* x: o+ _- B& u代碼注釋應(yīng)與被注釋的代碼緊鄰,放在其上方或右方,,不可放在下面。如放于上方則需與其上面的代碼用空行隔開,。一般少量注釋應(yīng)該添加在被注釋語句的行尾,,一個函數(shù)內(nèi)的多個注釋左對齊;較多注釋則應(yīng)加在上方且注釋行與被注釋的語句左對齊信盈達嵌入式企鵝要妖氣嗚嗚吧久零就要,。
7 [+ q% b# m. \) j9 W8 a% i函數(shù)代碼注釋用"//…//"的格式,。( L0 b S2 k1 j+ F2 Q' h6 E
通常,,分支語句(條件分支、循環(huán)語句等)必須編寫注釋,。其程序塊結(jié)束行"}"的右方應(yīng)加表明該程序塊結(jié)束的標(biāo)記"end of ……", 尤其在多重嵌套時,。
4 b5 X7 |4 r, d" U2 s3.4 變量、常量,、宏的注釋 " ~, r, k. _( }5 y z: R
同一類型的標(biāo)識符應(yīng)集中定義,,并在定義之前一行對其共性加以統(tǒng)一注釋,。對單個標(biāo)識符的注釋加在定義語句的行尾,。8 t. Q8 W- q* @3 a4 v6 U6 L# v
全局變量一定要有詳細的注釋,包括其功能,、取值范圍,、哪些函數(shù)或過程存取它以及存取時的注意事項等。
; t2 {- @6 Q( a. p$ I, u注釋用"//…//"的格式,。
* Y; \. @- O( J4.函數(shù) 4.1 函數(shù)設(shè)計原則
5 e$ B) H9 T* o5 ]函數(shù)的基本要求: & A0 J5 e, S' U1 z" C7 C3 e* C3 n. b
1)封裝性4 F2 ~. U2 |) M3 U
1) 正確性:程序要實現(xiàn)設(shè)計要求的功能,。
. [3 i+ B; `! |2) 穩(wěn)定性和安全性:程序運行穩(wěn)定、可靠,、安全,。9 W& b9 s( J8 u" s, p: `+ \' _
3) 可測試性:程序便于測試和評價。
; a5 C/ t, g% l+ [6 D k9 W# _ x2 O8 R4) 規(guī)范/可讀性:程序書寫風(fēng)格,、命名規(guī)則等符合規(guī)范,。
* I4 T1 N( q4 v, [6 B R, X5) 擴展性:代碼為下一次升級擴展留有空間和接口。4 I( y! E6 L. B% z. p: I1 ~; N
6) 全局效率:軟件系統(tǒng)的整體效率高,。
6 a' O O' A, N( r1 F/ h7) 局部效率:某個模塊/子模塊/函數(shù)的本身效率高,。
, O5 C/ L( R v# L7 p$ h/ r# q1 W編制函數(shù)的基本原則:
: p, I2 Q; L/ A* M4 F& k* C4 c( }% w1) 單個函數(shù)的規(guī)模盡量限制在200行以內(nèi)(不包括注釋和空行)。一個函數(shù)只完成一個功能,。9 K' `- d& ~7 G* k8 Q( a# {* W
2) 函數(shù)局部變量的數(shù)目一般不超過5~10個,。
" }+ _, D7 ]; N% X- I& i9 o3) 函數(shù)內(nèi)部局部變量定義區(qū)和功能實現(xiàn)區(qū)(包含變量初始化)之間空一行。; L Q7 I) W* ~4 w+ }: @& i
4) 函數(shù)名應(yīng)準(zhǔn)確描述函數(shù)的功能,。通常使用動賓詞組為執(zhí)行某操作的函數(shù)命名,。
4 y3 ~; E6 R4 V- ?9 x7 h5) 函數(shù)的返回值要清楚明了,尤其是出錯返回值的意義要準(zhǔn)確無誤,。
$ q- d1 I- D+ ~6) 不要把與函數(shù)返回值類型不同的變量,,以編譯系統(tǒng)默認的轉(zhuǎn)換方式或強制的轉(zhuǎn)換方式作為返回值返回。
$ C) l3 z6 N: Y& b: z* t4 Z7) 減少函數(shù)本身或函數(shù)間的遞歸調(diào)用,。- ~$ o& K, l5 S) }
8) 盡量不要將函數(shù)的參數(shù)作為工作變量,。& ?. M$ u6 a. e+ Q; C
4.2 函數(shù)定義
/ v5 z' e4 {9 [6 n1) 函數(shù)若沒有入口參數(shù)或者出口參數(shù),應(yīng)用void明確申明,。6 N \+ Q' Q4 V# R8 R1 A
2) 函數(shù)名稱與出口參數(shù)類型定義間應(yīng)該空一格且只空一格,。6 ]' i4 j r3 S# z6 g2 R' `
3) 函數(shù)名稱與括號()之間無空格。
3 w# G3 v/ t, B5 \3 ?$ R4) 函數(shù)形參必須給出明確的類型定義,。
) f5 L1 S8 m1 W5) 多個形參的函數(shù),,后一個形參與前一個形參的逗號分割符之間添加一個空格。
& u! t6 K' c+ V: T9 F" _6) 函數(shù)體的前后花括號"{}" 各獨占一行,。
8 K' M( w3 K# q: a# d" }$ M4.3 局部變量定義
, D! U" U H6 W. G1) 同一行內(nèi)不要定義過多變量,。; ]3 N1 F" e$ N6 z* @- X
2) 同一類的變量在同一行內(nèi)定義,或者在相鄰行定義,。+ C. ]2 _1 a% i% s$ U
3) 先定義data型變量,,再定義idtata型變量,,再定義xdata型變量.(?)
6 {; l' x Z. O$ L" t* Q: x4) 數(shù)組,、指針等復(fù)雜類型的定義放在定義區(qū)的最后,。8 ]3 T$ `0 ~4 \6 |' f
5) 變量定義區(qū)不做較復(fù)雜的變量賦值。
! G! v+ I+ U3 q s! `+ C0 A* U4.4 功能實現(xiàn)區(qū)規(guī)范 : t: m, b1 |: k% y
1) 一行只寫一條語句,。
# C( L+ M7 |; d6 y i' W2) 注意運算符的優(yōu)先級,,并用括號明確表達式的操作順序,避免使用默認優(yōu)先級信盈達嵌入式企鵝要妖氣嗚嗚吧久零就要,。
. @/ {' R2 b7 @. [3 k7 X. ]0 h U1 R3) 各程序段之間使用一個空行分隔,,加以必要的注釋。程序段指能完一個較具體的功能的一行或多行代碼,。程序段內(nèi)的各行代碼之間相互依賴性較強,。(1、2,、3方式)8 T& d. Y* z; S& \2 X
4) 不要使用難懂的技巧性很高的語句,。# s8 K8 i# z+ P! f* h
5) 源程序中關(guān)系較為緊密的代碼應(yīng)盡可能相鄰。" m2 ^8 U" I+ K. D1 i+ l; o) d+ m
6) 完成簡單功能,、關(guān)系非常密切的一條或幾條語句可編寫為函數(shù)或定義為宏,。
/ n) ~, H$ [3 P; N7 i& p% o5. 單片機編程規(guī)范-排版
+ c7 G. t6 j3 u5.1 縮進
- s8 ]4 b- r% l+ q4 e0 ^2 w代碼的每一級均往右縮進4個空格的位置。不使用Tab鍵 7 t( _: n* u7 ~
5.2 分行 6 s6 Y1 e' D9 s5 _2 u
每行語句(,?,??,?,?超過80個字符)要分成多行書寫;長表達式要在低優(yōu)先級操作符處劃分新行,,操作符放在新行之首,,劃分出的新行要進適當(dāng)?shù)目s進,使排版整齊,,語句可讀,。避免把注釋插入分行中。# X2 B+ q3 `$ Y) w2 v% S
5.3 空行
@0 Y4 l* d& c ~1) 文件注釋區(qū),、頭文件引用區(qū),、函數(shù)間應(yīng)該有且只有一行空行。3 t- ?0 C8 T' x0 G" l& @2 q
2) 相鄰函數(shù)之間應(yīng)該有且只有一行空行,。
X) d; }+ a9 Y, p( z3) 函數(shù)體內(nèi)相對獨立的程序塊之間可以用一行空行或注釋來分隔,。4 j0 K6 n% T4 s, k1 @
4) 函數(shù)注釋和對應(yīng)的函數(shù)體之間不應(yīng)該有空行。
" z6 ]2 S/ ?: \: A+ \0 z( Y+ i" Z5 t5) 文件末尾有且只有一行空行。
3 g6 {5 ^* h9 |" s5.4 空格
9 | \/ i+ o: q& k- A1) 函數(shù)語句尾部或者注釋之后不能有空格,。, W/ J. W8 x: O! Y7 f
2) 括號內(nèi)側(cè)(即左括號后面和右括號前面)不加空格,,多重括號間不加空格。
+ ~* T4 [4 ^' q2 V/ o+ F3) 函數(shù)形參之間應(yīng)該有且只有一個空格(形參逗號后面加空格),。4 v- X7 B& \( O! D z+ T
4) 同一行中定義的多個變量間應(yīng)該有且只有一個空格(變量逗號后面加空格)。3 O/ a' h) e+ ]9 }* D! m' j' f
5) 表達式中,,若有多個操作符連寫的情況,,應(yīng)使用空格對它們分隔:
3 c/ n3 J7 D& p8 Q. y8 Z- S6) 在兩個以上的關(guān)鍵字、變量,、常量進行對等操作時,,它們之間的操作符前后均加一個空格;在兩個以上的關(guān)鍵字,、變量,、常量進行非對等操作時,其前后均不應(yīng)加空格,;
: ~7 r+ u! P& `7) 逗號只在后面加空格,;$ t# N. e) w. E, c: M
8) 雙目操作符,如比較操作符, 賦值操作符"=",、"+=",,算術(shù)操作符"+"、"%",,邏輯操作符"&&",、"&",位操作符"<<",、"^"等,,前后均加一個空格;
0 b& Z c q x {+ B9) 單目操作符,,如"!",、"~"、"++",、"-",、"&"(地址運算符)等,前后不加空格,;
( a$ F" T; `1 T# N0 |10) "->",、"."前后不加空格;
7 k/ T$ D' W+ r, @11) if,、for,、while、switch等關(guān)鍵字與后面的括號間加一個空格; r) ~( B. ^5 P- i7 e ^) B
5.5 花括號
, N! Y+ F8 @5 }2 b* S6 r1) if,、else if,、else、for,、while語句無論其執(zhí)行體是一條語句還是多條語句都必須加花括號,,且左右花括號各獨占一行。% n/ F& I1 h7 D- F* P# O
2) do{}while()結(jié)構(gòu)中,,"do"和"{"均各占一行,,"}"和"while();"共同占用一行。: p1 L% b; t$ S6 V3 q9 V
if ( ) do
. D# |# ~; _/ k( h( |" ]: H1 c{ {6 M4 L! ~- m+ q6 q B3 \
} }while( );) l: d" R: F# r& [- B' z9 @3 E
else2 t$ L# x5 d) N! o7 r' X& o- z
{
: s# O# e* y6 q8 r}, t# {9 E5 T4 d, X0 m( c% K
嵌套越少越好,,{}不準(zhǔn)超過3層
; g( g% E( y8 k8 I) r) E: @7 ?5.6 switch語句
! W& Z8 [5 C/ b" Y3 m7 s4 ]) h1) 每個case和其判據(jù)條件獨占一行,。
% g- V- G1 c4 p3 u$ k# J. Q5 H* ~; B/ e0 Y2) 每個case程序塊需用break結(jié)束。特殊情況下需要從一個case塊順序執(zhí)行到下一個case塊的時候除外,,但需要花括號在交界處明確注釋如此操作的原因,,以防止出錯。 Z+ ?" Z. y) h# n4 s
3) case程序塊之間空一行,,且只空一行,。
4 y- v5 l. O% L7 ^( [4) 每個case程序塊的執(zhí)行語句保持4個空格的縮進。% N3 m0 Q# k- h5 ]* P
5) 一般情況下都應(yīng)該包含default分支,。
" s2 E( M' j" y( n' P& X8 oSwitch ( )
) f9 ~' {6 r. v{
0 y9 S: c7 \; k/ M& A& u& zcase x:
0 B7 t9 ?9 U0 `break;
9 ^& Z8 T+ y& m3 Gcase x:
# T* H+ r7 M- S) p: J5 {break;
2 F8 s! a. y, Y% y' Ldefault:) Y& e" U! N; U1 Q. x1 r; s
break;) @' h9 Y P9 h( J
}
+ T; O$ y- r" e3 j2 ?6 d( u6.程序結(jié)構(gòu) 6.1 基本要求
$ D& |$ }9 R( f+ |4 D1) 有main()函數(shù)的.c文件應(yīng)將main()放在最前面,,并明確用void聲明參數(shù)和返回值。
8 H9 T$ Q1 f3 U/ Z% |: I: H2) 對由多個.c文件組成的模塊程序或完整監(jiān)控程序,,建立公共引用頭文件,,將需要引用的庫頭文件、標(biāo)準(zhǔn)寄存器定義頭文件,、自定義的頭文件,、全局變量等均包含在內(nèi),供每個文件引用,。通常,,標(biāo)準(zhǔn)函數(shù)庫頭文件采用尖角號< >標(biāo)志文件名,自定義頭文件采用雙撇號″″標(biāo)志文件名,。
9 b8 ]6 H, M& Z1 W8 b3) 每個.c文件有一個對應(yīng)的.h文件,,.c文件的注釋之后首先定義一個唯一的文件標(biāo)志宏,并在對應(yīng)的.h文件中解析該標(biāo)志,。( v) f4 V& z2 S+ X
在.c文件中:* s3 O: W# c( K6 L
#define FILE_FLAG7 T+ }4 @: B# l1 u! V# w
在.h文件中:&
: u \3 P: q' t2 X6.程序結(jié)構(gòu) 6.1 基本要求
1 ^/ W) H3 r+ h; x" O8 F/ Z; v1) 有main()函數(shù)的.c文件應(yīng)將main()放在最前面,,并明確用void聲明參數(shù)和返回值。! f& J- G! I* L* Y+ R
2) 對由多個.c文件組成的模塊程序或完整監(jiān)控程序,,建立公共引用頭文件,,將需要引用的庫頭文件,、標(biāo)準(zhǔn)寄存器定義頭文件、自定義的頭文件,、全局變量等均包含在內(nèi),,供每個文件引用。通常,,標(biāo)準(zhǔn)函數(shù)庫頭文件采用尖角號< >標(biāo)志文件名,,自定義頭文件采用雙撇號″″標(biāo)志文件名。& U5 B# K- j! E
3) 每個.c文件有一個對應(yīng)的.h文件,,.c文件的注釋之后首先定義一個唯一的文件標(biāo)志宏,,并在對應(yīng)的.h文件中解析該標(biāo)志。
! V& q- }- {: ?; {! C8 g1 c在.c文件中:
6 b a4 G5 w7 L2 o. `$ W. t( Y2 {#define FILE_FLAG, s! H6 U! |0 Y; x. p+ @
在.h文件中:
- }; w+ H6 [3 a+ q- a#ifdef FILE_FLAG
. z( z/ |) O4 o6 k+ }+ y1 @#define XXX
% w: r3 j) X. N#else/ n6 R' E: ]& t5 V0 i
#define XXX extern
. [% A) _# V$ {/ |6 y$ A* d#endif' c8 ^# {; H3 k5 H
4) 對于確定只被某個.c文件調(diào)用的定義可以單獨列在一個頭文件中,、單獨調(diào)用,。7 Q$ D+ b* `2 f8 n1 V$ _) I* a
& U* Z6 L, ?6 ~* a4 M3 d; C- K |