色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線(xiàn)課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

安富萊C語(yǔ)言編碼規(guī)范

GReq_mcu168 ? 來(lái)源:果果小師弟 ? 作者:果果小師弟 ? 2022-06-22 14:38 ? 次閱讀

摘要所謂無(wú)規(guī)矩不成方圓。任何團(tuán)隊(duì),規(guī)范都是怎么也繞不開(kāi)的話(huà)題。特別是在我們搞嵌入式C開(kāi)發(fā)的,代碼規(guī)范乃是開(kāi)發(fā)的重中之重。有太多的理由去做規(guī)范,因?yàn)槊總€(gè)人的代碼編寫(xiě)喜好不同,代碼風(fēng)格也迥然不同。每一個(gè)程序員心目中對(duì)好代碼都有自己的主見(jiàn),統(tǒng)一的編碼規(guī)范可以像秦始皇統(tǒng)一戰(zhàn)國(guó)一樣,避免不必要的論戰(zhàn)和爭(zhēng)議。

有時(shí)候會(huì)幫同學(xué)看一下代碼,發(fā)現(xiàn)大多寫(xiě)代碼都是隨心所欲。看起開(kāi)非常頭大,雖然C語(yǔ)言很重要,但是C語(yǔ)言代碼規(guī)范也非常重要。今天分享的就是安富萊C語(yǔ)言編碼規(guī)范,建議初學(xué)者去官網(wǎng)看看他們的代碼,非常標(biāo)準(zhǔn)!

一、文件與目錄

1、文件及目錄的命名規(guī)定可用的字符集是A-Z;a-z;0-9;._-

2、源文件名后綴用小寫(xiě)字母.c.h。

3、文件的命名要準(zhǔn)確清晰地表達(dá)其內(nèi)容,同時(shí)文件名應(yīng)該精練,防止文件名過(guò)長(zhǎng)而造成使用不便。在文件名中可以適當(dāng)?shù)厥褂每s寫(xiě)。

以下提供兩種命名方式以供參考:(1)各程序模塊的文件命名開(kāi)頭 2 個(gè)小寫(xiě)字母代表本模塊的功能:如:主控程序?yàn)?code style="margin:0px 2px;padding:2px 4px;max-width:100%;font-size:14px;background-color:rgba(27,31,35,.05);font-family:'Operator Mono', Consolas, Monaco, Menlo, monospace;color:rgb(255,93,108);">mpMain.c,mpDisp.c… (2)不寫(xiě)模塊功能標(biāo)識(shí):如:主控程序?yàn)?code style="margin:0px 2px;padding:2px 4px;max-width:100%;font-size:14px;background-color:rgba(27,31,35,.05);font-family:'Operator Mono', Consolas, Monaco, Menlo, monospace;color:rgb(255,93,108);">Main.c,Disp.c

4、一個(gè)軟件包或一個(gè)邏輯組件的所有頭文件和源文件建議放在一個(gè)單獨(dú)的目錄下,這樣有利于查找并使用相關(guān)的文件,有利于簡(jiǎn)化一些編譯工具的設(shè)置。

5、對(duì)于整個(gè)項(xiàng)目需要的公共頭文件,應(yīng)存放在一個(gè)單獨(dú)的目錄下(例如:myProject/include)下,可避免其他編寫(xiě)人引用時(shí)目錄太過(guò)分散的問(wèn)題。

6、對(duì)于源碼文件中的段落安排,我們建議按如下的順序排列:

  • a. 文件頭注釋
  • b. 防止重復(fù)引用頭文件的設(shè)置
  • c. #include 部分
  • d. #define 部分
  • e. enum 常量聲明
  • f. 類(lèi)型聲明和定義,包括 struct、union、typedef 等
  • g. 全局變量聲明
  • h. 文件級(jí)變量聲明
  • i. 全局或文件級(jí)函數(shù)聲明
  • j. 函數(shù)實(shí)現(xiàn)。按函數(shù)聲明的順序排列
  • k. 文件尾注釋

7、在引用頭文件時(shí),不要使用絕對(duì)路徑。如果使用絕對(duì)路徑,當(dāng)需要移動(dòng)目錄時(shí),必須修改所有相關(guān)代碼,繁瑣且不安全;使用相對(duì)路徑,當(dāng)需要移動(dòng)目錄時(shí),只需修改編譯器的某個(gè)選項(xiàng)即可

#include“/project/inc/hello.h”/*不應(yīng)使用絕對(duì)路徑*/
#include“../inc/hello.h”/*可以使用相對(duì)路徑*/

8、在引用頭文件時(shí),使用 <> 來(lái)引用預(yù)定義或者特定目錄的頭文件,使用 “” 來(lái)引用當(dāng)前目錄或者路徑相對(duì)于當(dāng)前目錄的頭文件

#include/*標(biāo)準(zhǔn)頭文件*/
#include/*工程指定目錄頭文件*/
#include“global.h”/*當(dāng)前目錄頭文件*/
#include“inc/config.h”/*路徑相對(duì)于當(dāng)前目錄的頭文件*/

9、為了防止頭文件被重復(fù)引用,應(yīng)當(dāng)用ifndef/define/endif結(jié)構(gòu)產(chǎn)生預(yù)處理塊。

#ifndef__DISP_H/*文件名前名加兩個(gè)下劃線(xiàn)“__”,后面加“_H”
#define__DISP_H
...
...
#endif

10、頭文件中只存放“聲明”而不存放“定義”,通過(guò)這種方式可以避免重復(fù)定義。

/*模塊 1 頭文件:module1.h */
externinta=5;/*在模塊1的.h文件中聲明變量*/

/*模塊 1 實(shí)現(xiàn)文件:module1.c */
uint8_tg_ucPara;/*在模塊1的.h文件中定義全局變量g_ucPara*/

11、如果其它模塊需要引用全局變量g_ucPara, 只需要在文件開(kāi)頭包含module1.h

/*模塊 2 實(shí)現(xiàn)文件:module2.c */
#include“module1.h”/*在模塊2中包含模塊1的.h文件*/
......
g_ucPara=0;
......

12、對(duì)于文件的長(zhǎng)度沒(méi)有非常嚴(yán)格的要求,但應(yīng)盡量避免文件過(guò)長(zhǎng)。一般來(lái)說(shuō),文件長(zhǎng)度應(yīng)盡量保持在1000行之內(nèi)。

二、排版

1、程序塊要采用縮進(jìn)風(fēng)格編寫(xiě),縮進(jìn)的空格數(shù)為 4 個(gè)

2、相對(duì)獨(dú)立的程序塊之間、變量說(shuō)明之后必須加空行。

voidDemoFunc(void)

{

uint8_ti;

<----?局部變量和語(yǔ)句間空一行

/*功能塊1*/

for(i=0;i10;i++)

{

...

}

<----?不同的功能塊間空一行

/*功能塊2*/

for(i=0;i20;i++)

{

...

}

}

3、作符處劃分新行,操作符放在新行之首,劃分出的新行要進(jìn)行適當(dāng)?shù)目s進(jìn),使排版整齊,語(yǔ)句可讀。

if((ucParam1==0)&&(ucParam2==0)&&(ucParam3==0)

||(ucParam4==0))<----?長(zhǎng)表達(dá)式需要換行書(shū)寫(xiě)

{

......

}

4、不允許把多個(gè)短語(yǔ)句寫(xiě)在一行中,即一行只寫(xiě)一條語(yǔ)句

rect.length=0;rect.width=0;<----?不正確的寫(xiě)法

rect.length?=?0;<----?正確的寫(xiě)法

rect.width?=?0;

5、對(duì)齊使用TAB 鍵,1 個(gè) TAB 對(duì)應(yīng) 4 個(gè)字符位。

6、函數(shù)或過(guò)程的開(kāi)始、結(jié)構(gòu)的定義及循環(huán)、判斷等語(yǔ)句中的代碼都要采用縮進(jìn)風(fēng)格,case 語(yǔ)句下的情況處理語(yǔ)句也要遵從語(yǔ)句縮進(jìn)要求。

7、程序塊的分界符(如大括號(hào)‘{’和‘}’ )應(yīng)各獨(dú)占一行并且位于同一列,同時(shí)與引用它們的語(yǔ)句左對(duì)齊。在函數(shù)體的開(kāi)始、類(lèi)的定義、結(jié)構(gòu)的定義、枚舉的定義以及 if、for、do、while、switch、case 語(yǔ)句中的程序都要采用如上的縮進(jìn)方式。對(duì)于與規(guī)則不一致的現(xiàn)存代碼,應(yīng)優(yōu)先保證同一模塊中的風(fēng)格一致性。

for(...){<----?不規(guī)范的寫(xiě)法

...?/*programcode*/

}

for(...)

{<----?規(guī)范的寫(xiě)法

...?/*programcode*/

}

if(...)

{<----?不規(guī)范的寫(xiě)法

...?/*programcode*/

}

if(...)

{<----?規(guī)范的寫(xiě)法

...?/*programcode*/

}

8、在兩個(gè)以上的關(guān)鍵字、變量、常量進(jìn)行對(duì)等操作時(shí),它們之間的操作符之前、之后或者前后要加空格;進(jìn)行非對(duì)等操作時(shí),如果是關(guān)系密切的立即操作符(如->),后不應(yīng)加空格。說(shuō)明:采用這種松散方式編寫(xiě)代碼的目的是使代碼更加清晰。

由于留空格所產(chǎn)生的清晰性是相對(duì)的,所以,在已經(jīng)非常清晰的語(yǔ)句中沒(méi)有必要再留空格,如果語(yǔ)句已足夠清晰則括號(hào)內(nèi)側(cè)(即左括號(hào)后面和右括號(hào)前面)不需要加空格,多重括號(hào)間不必加空格,因?yàn)樵?C語(yǔ)言中括號(hào)已經(jīng)是最清晰的標(biāo)志了。

在長(zhǎng)語(yǔ)句中,如果需要加的空格非常多,那么應(yīng)該保持整體清晰,而在局部不加空格。給操作符留空格時(shí)不要連續(xù)留兩個(gè)以上空格。

(1)逗號(hào)、分號(hào)只在后面加空格。

int_32a,b,c;

(2)比較操作符,賦值操作符"="、 "+=",算術(shù)操作符"+"、"%",邏輯操作符"&&"、"&",位域操作符"<<"、"^"等雙目操作符的前后加空格。

if(current_time>=MAX_TIME_VALUE)
a=b+c;
a*=2;
a=b^2;

(3)"!"、"~"、"++"、"--"、"&"(地址運(yùn)算符)等單目操作符前后不加空格。

*p='a';/*內(nèi)容操作"*"與內(nèi)容之間*/
flag=!isEmpty;/*非操作"!"與內(nèi)容之間*/
p=&mem;/*地址操作"&"與內(nèi)容之間*/
i++;/*"++","--"與內(nèi)容之間*/

(4)"->"、"."前后不加空格。

p->id=pid;/*"->"指針前后不加空格*/

(5)if、for、while、switch 等與后面的括號(hào)間應(yīng)加空格,使 if 等關(guān)鍵字更為突出、明顯,函數(shù)名與其后的括號(hào)之間不加空格,以與保留字區(qū)別開(kāi)。

if(a>=b&&c>d)

三、注釋

1、一般情況下,源程序有效注釋量必須在 20%以上。說(shuō)明:注釋的原則是有助于對(duì)程序的閱讀理解,在該加的地方都加,注釋不宜太多也不能太少,注釋語(yǔ)言必須準(zhǔn)確、易懂、簡(jiǎn)潔。

2、在文件的開(kāi)始部分,應(yīng)該給出關(guān)于文件版權(quán)、內(nèi)容簡(jiǎn)介、修改歷史等項(xiàng)目的說(shuō)明。具體的格式請(qǐng)參見(jiàn)如下的說(shuō)明。在創(chuàng)建代碼和每次更新代碼時(shí),都必須在文件的歷史記錄中標(biāo)注版本號(hào)、日期、作者、更改說(shuō)明等項(xiàng)目。其中的版本號(hào)的格式為兩個(gè)數(shù)字字符和一個(gè)英文字母字符。數(shù)字字符表示大的改變,英文字符表示小的修改。如果有必要,還應(yīng)該對(duì)其它的注釋內(nèi)容也進(jìn)行同步的更改。注意:注釋第一行星號(hào)要求為 76 個(gè),結(jié)尾行星號(hào)為 1 個(gè)

/****************************************************************************

*Copyright(C),2010-2011,武漢xxx系統(tǒng)有限責(zé)任公司

*文件名:main.c

*內(nèi)容簡(jiǎn)述:

*

*文件歷史:

*版本號(hào)日期作者說(shuō)明

*01a2020-07-29xxx創(chuàng)建該文件

*01b2020-08-20xxx改為可以在字符串中發(fā)送回車(chē)符

*02a2020-12-03xxx增加文件頭注釋

*/

3、對(duì)于函數(shù),在函數(shù)實(shí)現(xiàn)之前,應(yīng)該給出和函數(shù)的實(shí)現(xiàn)相關(guān)的足夠而精練的注釋信息。內(nèi)容包括本函數(shù)功能介紹,調(diào)用的變量、常量說(shuō)明,形參說(shuō)明,特別是全局、全程或靜態(tài)變量(慎用靜態(tài)變量),要求對(duì)其初值,調(diào)用后的預(yù)期值作詳細(xì)的闡述。具體的書(shū)寫(xiě)格式和包含的各項(xiàng)內(nèi)容請(qǐng)參見(jiàn)如下的例子。

下面這段函數(shù)的注釋比較標(biāo)準(zhǔn),當(dāng)然,并不局限于此格式,但上述信息建議要包含在內(nèi)。

/****************************************************************************

*函數(shù)名:SendToCard()

*功能:向讀卡器發(fā)命令,如果讀卡器進(jìn)入休眠,則首先喚醒它

*輸入:全局變量gaTxCard[]存放待發(fā)的數(shù)據(jù)

*全局變量gbTxCardLen存放長(zhǎng)度

*輸出:無(wú)

*/

4、邊寫(xiě)代碼邊注釋?zhuān)薷拇a同時(shí)修改相應(yīng)的注釋?zhuān)员WC注釋與代碼的一致性。不再有用的注釋要?jiǎng)h除。

5、注釋的內(nèi)容要清楚、明了,含義準(zhǔn)確,防止注釋二義性。說(shuō)明:錯(cuò)誤的注釋不但無(wú)益反而有害。注釋主要闡述代碼做了什么(What),或者如果有必要的話(huà),闡述為什么要這么做(Why),注釋并不是用來(lái)闡述它究竟是如何實(shí)現(xiàn)算法(How)的。

6、避免在注釋中使用縮寫(xiě),特別是非常用縮寫(xiě)。說(shuō)明:在使用縮寫(xiě)時(shí)或之前,應(yīng)對(duì)縮寫(xiě)進(jìn)行必要的說(shuō)明。

7、注釋?xiě)?yīng)與其描述的代碼靠近,對(duì)代碼的注釋?xiě)?yīng)放在其上方或右方(對(duì)單條語(yǔ)句的注釋)相鄰位置,不可放在下面,如放于上方則需與其上面的代碼用空行隔開(kāi)。

例 1:不規(guī)范的寫(xiě)法

/*獲取復(fù)本子系統(tǒng)索引網(wǎng)絡(luò)指示器*/

<----?不規(guī)范的寫(xiě)法,此處不應(yīng)該空行

repssn_ind?=?ssn_data[index].repssn_index;

repssn_ni?=?ssn_data[index].ni;

例 2:不規(guī)范的寫(xiě)法

repssn_ind=ssn_data[index].repssn_index;

repssn_ni=ssn_data[index].ni;

/*獲取復(fù)本子系統(tǒng)索引和網(wǎng)絡(luò)指示器*/<----?不規(guī)范的寫(xiě)法,應(yīng)該在語(yǔ)句前注釋

例 3:規(guī)范的寫(xiě)法

/*獲取復(fù)本子系統(tǒng)索引和網(wǎng)絡(luò)指示器*/

repssn_ind=ssn_data[index].repssn_index;

repssn_ni=ssn_data[index].ni;

例 4:不規(guī)范的寫(xiě)法,顯得代碼過(guò)于緊湊

/*codeonecomments*/

programcodeone

/*codetwocomments*/<----?不規(guī)范的寫(xiě)法,兩段代碼之間需要加空行

program?code?two

例 5:規(guī)范的寫(xiě)法

/*codeonecomments*/

programcodeone

/*codetwocomments*/

programcodetwo

8、注釋與所描述內(nèi)容進(jìn)行同樣的縮排。說(shuō)明:可使程序排版整齊,并方便注釋的閱讀與理解。

例 1:如下例子,排版不整齊,閱讀稍感不方便。

voidexample_fun(void)

{

/*codeonecomments*/<----?不規(guī)范的寫(xiě)法,注釋和代碼應(yīng)該相同的縮進(jìn)

CodeBlock?One

/*codetwocomments*/<----?不規(guī)范的寫(xiě)法,注釋和代碼應(yīng)該相同的縮進(jìn)

CodeBlock?Two

}

例 2:正確的布局。

voidexample_fun(void)

{

/*codeonecomments*/

CodeBlockOne

/*codetwocomments*/

CodeBlockTwo

}

9、對(duì)變量的定義和分支語(yǔ)句(條件分支、循環(huán)語(yǔ)句等)必須編寫(xiě)注釋。說(shuō)明:這些語(yǔ)句往往是程序?qū)崿F(xiàn)某一特定功能的關(guān)鍵,對(duì)于維護(hù)人員來(lái)說(shuō),良好的注釋幫助更好的理解程序,有時(shí)甚至優(yōu)于看設(shè)計(jì)文檔。

10、對(duì)于switch語(yǔ)句下的case語(yǔ)句,如果因?yàn)樘厥馇闆r需要處理完一個(gè)case后進(jìn)入下一個(gè)case 處理,必須在該case語(yǔ)句處理完、下一個(gè)case語(yǔ)句前加上明確的注釋。說(shuō)明:這樣比較清楚程序編寫(xiě)者的意圖,有效防止無(wú)故遺漏 break 語(yǔ)句。

11、注釋格式盡量統(tǒng)一,建議使用“/* …… */”,因?yàn)?C++注釋“//”并不被所有 C 編譯器支持。

12、注釋?xiě)?yīng)考慮程序易讀及外觀排版的因素,使用的語(yǔ)言若是中、英兼有的,建議多使用中文,除非能非常流利準(zhǔn)確的用英文表達(dá)。說(shuō)明:注釋語(yǔ)言不統(tǒng)一,影響程序易讀性和外觀排版,出于對(duì)維護(hù)人員的考慮,建議使用中文。

13、標(biāo)識(shí)符的命名要清晰、明了,有明確含義,同時(shí)使用完整的單詞或大家基本可以理解的縮寫(xiě),避免使人產(chǎn)生誤解。

說(shuō)明:較短的單詞可通過(guò)去掉“元音”形成縮寫(xiě);較長(zhǎng)的單詞可取單詞的頭幾個(gè)字母形成縮寫(xiě);一些單詞有大家公認(rèn)的縮寫(xiě)。示例:如下單詞的縮寫(xiě)能夠被大家基本認(rèn)可。

temp可縮寫(xiě)為tmp;
flag可縮寫(xiě)為flg;
statistic可縮寫(xiě)為stat;
increment可縮寫(xiě)為inc;
message可縮寫(xiě)為msg;

14、命名中若使用特殊約定或縮寫(xiě),則要有注釋說(shuō)明。說(shuō)明:應(yīng)該在源文件的開(kāi)始之處,對(duì)文件中所使用的縮寫(xiě)或約定,特別是特殊的縮寫(xiě),進(jìn)行必要的注釋說(shuō)明。

15、自己特有的命名風(fēng)格,要自始至終保持一致,不可來(lái)回變化。說(shuō)明:個(gè)人的命名風(fēng)格,在符合所在項(xiàng)目組或產(chǎn)品組的命名規(guī)則的前提下,才可使用。(即命名規(guī)則中沒(méi)有規(guī)定到的地方才可有個(gè)人命名風(fēng)格)。

16、對(duì)于變量命名,禁止取單個(gè)字符(如 i、j、k...),建議除了要有具體含義外,還能表明其變量類(lèi)型、數(shù)據(jù)類(lèi)型等,但 i、j、k 作局部循環(huán)變量是允許的。說(shuō)明:變量,尤其是局部變量,如果用單個(gè)字符表示,很容易敲錯(cuò)(如i寫(xiě)成j),而編譯時(shí)又檢查不出來(lái),有可能為了這個(gè)小小的錯(cuò)誤而花費(fèi)大量的查錯(cuò)時(shí)間。

17、命名規(guī)范必須與所使用的系統(tǒng)風(fēng)格保持一致,并在同一項(xiàng)目中統(tǒng)一,比如采用 UNIX 的全小寫(xiě)加下劃線(xiàn)的風(fēng)格或大小寫(xiě)混排的方式,不要使用大小寫(xiě)與下劃線(xiàn)混排的方式,用作特殊標(biāo)識(shí)如標(biāo)識(shí)成員變量或全局變量的 m_和 g_,其后加上大小寫(xiě)混排的方式是允許的。

示例:Add_User不允許,add_userAddUserm_AddUser允許。

18、 除非必要,不要用數(shù)字或較奇怪的字符來(lái)定義標(biāo)識(shí)符。示例:如下命名,使人產(chǎn)生疑惑。

uint8_tdat01;

voidSet00(uint_8c);

應(yīng)改為有意義的單詞命名。

uint8_tucWidth;

voidSetParam(uint_8_ucValue);

19、在同一軟件產(chǎn)品內(nèi),應(yīng)規(guī)劃好接口部分標(biāo)識(shí)符(變量、結(jié)構(gòu)、函數(shù)及常量)的命名,防止編譯、鏈接時(shí)產(chǎn)生沖突。說(shuō)明:對(duì)接口部分的標(biāo)識(shí)符應(yīng)該有更嚴(yán)格限制,防止沖突。如可規(guī)定接口部分的變量與常量之前加上“模塊”標(biāo)識(shí)等。

20、除了編譯開(kāi)關(guān)/頭文件等特殊應(yīng)用,應(yīng)避免使用_EXAMPLE_TEST_之類(lèi)以下劃線(xiàn)開(kāi)始和結(jié)尾的定義。

四、變量、結(jié)構(gòu)、常量、宏

1、為了方便書(shū)寫(xiě)及記憶,變量類(lèi)型采用如下重定義:

typedefunsignedcharuint8_t;

typedefunsignedshortuint16_t;

typedefunsignedlongintuint32_t;

typedefsignedcharint8_t;

typedefsignedshortint16_t;

typedefsignedlongintint32_t;

#define__IOvolatile

2、常見(jiàn)類(lèi)型的前綴

(1)對(duì)于一些常見(jiàn)類(lèi)型的變量,應(yīng)在其名字前標(biāo)注表示其類(lèi)型的前綴。前綴用小寫(xiě)字母表示。前綴的使用請(qǐng)參照下列表格中說(shuō)明。(2)對(duì)于幾種變量類(lèi)型組合,前綴可以迭加。

3、變量作用域的前綴

為了清晰的標(biāo)識(shí)變量的作用域,減少發(fā)生命名沖突,應(yīng)該在變量類(lèi)型前綴之前再加上表示變量作用域的前綴,并在變量類(lèi)型前綴和變量作用域前綴之間用下劃線(xiàn)-隔開(kāi)。

(1)對(duì)于全局變量(global variable),在其名稱(chēng)前加g和變量類(lèi)型符號(hào)前綴。

uint32_tg_ulParaWord;

uint8_tg_ucByte;

(2)對(duì)于靜態(tài)變量(static variable),在其名稱(chēng)前加“s”和變量類(lèi)型符號(hào)前綴。

staticuint32_ts_ulParaWord;

staticuint8_ts_ucByte;

(3)函數(shù)內(nèi)部等局部變量前不加作用域前綴。(4)對(duì)于常量,當(dāng)可能發(fā)生作用域和名字沖突問(wèn)題時(shí),以上幾條規(guī)則對(duì)于常量同樣適用。注意,雖然常量名的核心部分全部大寫(xiě),但此時(shí)常量的前綴仍然用小寫(xiě)字母,以保持前綴的一致性。

4、對(duì)于結(jié)構(gòu)體命名類(lèi)型,表示類(lèi)型的名字,所有名字以小寫(xiě)字母tag開(kāi)頭,之后每個(gè)英文單詞的第一個(gè)字母大寫(xiě)(包括第一個(gè)單詞的第一個(gè)字母),其他字母小寫(xiě),結(jié)尾_T標(biāo)識(shí)。單詞之間不使用下劃線(xiàn)分隔,結(jié)構(gòu)體變量以t開(kāi)頭。

/*結(jié)構(gòu)體命名類(lèi)型名*/

typedefstructtagBillQuery_T

{

...

}BillQuery_T;

/*結(jié)構(gòu)體變量定義*/

BillQuery_TtBillQuery;

對(duì)于枚舉定義全部采用大寫(xiě),結(jié)尾_E標(biāo)識(shí)。

typedefenum

{

KB_F1=0,/*F1鍵代碼*/

KB_F2,/*F2鍵代碼*/

KB_F3/*F3鍵代碼*/

}KEY_CODE_E;

5、常量、宏、模版的名字應(yīng)該全部大寫(xiě)。如果這些名字由多個(gè)單詞組成,則單詞之間用下劃線(xiàn)分隔。宏指所有用宏形式定義的名字,包括常量類(lèi)和函數(shù)類(lèi);常量也包括枚舉中的常量成員。

#defineLOG_BUF_SIZE8000

6、不推薦使用位域。

五、函數(shù)

1、函數(shù)的命名規(guī)則。每一個(gè)函數(shù)名前綴需包含模塊名,模塊名為小寫(xiě),與函數(shù)名區(qū)別開(kāi)。如:uartReceive(串口接收)備注:對(duì)于非常簡(jiǎn)單的程序,可以不加模塊名。

2、函數(shù)的的形參需另啟一行,在后面給予說(shuō)明,形參都以下劃線(xiàn)_開(kāi)頭,已示與普通變量進(jìn)行區(qū)分,對(duì)于沒(méi)有形參為空的函數(shù)(void)括號(hào)緊跟函數(shù)后面。

/******************************************************************************

*函數(shù)名:uartConvUartBaud

*功能:波特率轉(zhuǎn)換

*輸入:_ulBaud :波特率

*輸出:無(wú)

*返回:uint32-轉(zhuǎn)換后的波特率值

*/

uint32_tuartConvUartBaud(uint32_t_ulBaud)

{

uint32_tulBaud;

ulBaud=ulBaud*2;/*計(jì)算波特率*/

......

returnulBaud;

}

復(fù)制代碼

3、一個(gè)函數(shù)僅完成一件功能。

4、函數(shù)名應(yīng)準(zhǔn)確描述函數(shù)的功能。避免使用無(wú)意義或含義不清的動(dòng)詞為函數(shù)命名。使用動(dòng)賓詞組為執(zhí)行某操作的函數(shù)命名。說(shuō)明:避免用含義不清的動(dòng)詞如process、handle等為函數(shù)命名,因?yàn)檫@些動(dòng)詞并沒(méi)有說(shuō)明要具體做什么。示例:參照如下方式命名函數(shù)。

voidPrintRecord(uint32_t_RecInd);

int32InputRecord(void);

uint8_tGetCurrentColor(void);

5、檢查函數(shù)所有參數(shù)輸入的有效性。說(shuō)明:如果約定由調(diào)用方檢查參數(shù)輸入,則應(yīng)使用assert()之類(lèi)的宏,來(lái)驗(yàn)證所有參數(shù)輸入的有效性。

6、檢查函數(shù)所有非參數(shù)輸入的有效性,如數(shù)據(jù)文件、公共變量等。說(shuō)明:函數(shù)的輸入主要有兩種:一種是參數(shù)輸入;另一種是全局變量、數(shù)據(jù)文件的輸入,即非參數(shù)輸入。函數(shù)在使用輸入之前,應(yīng)進(jìn)行必要的檢查。

7、防止將函數(shù)的參數(shù)作為工作變量。說(shuō)明:將函數(shù)的參數(shù)作為工作變量,有可能錯(cuò)誤地改變參數(shù)內(nèi)容,所以很危險(xiǎn)。對(duì)必須改變的參數(shù),最好先用局部變量代之,最后再將該局部變量的內(nèi)容賦給該參數(shù)。

8、避免設(shè)計(jì)五個(gè)以上參數(shù)函數(shù),不使用的參數(shù)從接口中去掉。說(shuō)明:目的減少函數(shù)間接口的復(fù)雜度,復(fù)雜的參數(shù)可以使用結(jié)構(gòu)傳遞。

9、在調(diào)用函數(shù)填寫(xiě)參數(shù)時(shí),應(yīng)盡量減少?zèng)]有必要的默認(rèn)數(shù)據(jù)類(lèi)型轉(zhuǎn)換或強(qiáng)制數(shù)據(jù)類(lèi)型轉(zhuǎn)換。說(shuō)明:因?yàn)閿?shù)據(jù)類(lèi)型轉(zhuǎn)換或多或少存在危險(xiǎn)。

10、避免使用 BOOL 參數(shù)。說(shuō)明:原因有二,其一是BOOL參數(shù)值無(wú)意義,TURE/FALSE的含義是非常模糊的,在調(diào)用時(shí)很難知道該參數(shù)到底傳達(dá)的是什么意思;其二是BOOL參數(shù)值不利于擴(kuò)充。還有NULL也是一個(gè)無(wú)意義的單詞。

11、函數(shù)的返回值要清楚、明了。除非必要,最好不要把與函數(shù)返回值類(lèi)型不同的變量,以編譯系統(tǒng)默認(rèn)的轉(zhuǎn)換方式或強(qiáng)制的轉(zhuǎn)換方式作為返回值返回。

12、防止把沒(méi)有關(guān)聯(lián)的語(yǔ)句放到一個(gè)函數(shù)中。說(shuō)明:防止函數(shù)或過(guò)程內(nèi)出現(xiàn)隨機(jī)內(nèi)聚。隨機(jī)內(nèi)聚是指將沒(méi)有關(guān)聯(lián)或關(guān)聯(lián)很弱的語(yǔ)句放到同一個(gè)函數(shù)或過(guò)程中。隨機(jī)內(nèi)聚給函數(shù)或過(guò)程的維護(hù)、測(cè)試及以后的升級(jí)等造成了不便,同時(shí)也使函數(shù)或過(guò)程的功能不明確。使用隨機(jī)內(nèi)聚函數(shù),常常容易出現(xiàn)在一種應(yīng)用場(chǎng)合需要改進(jìn)此函數(shù),而另一種應(yīng)用場(chǎng)合又不允許這種改進(jìn),從而陷入困境。

編程時(shí),經(jīng)常遇到在不同函數(shù)中使用相同的代碼,許多開(kāi)發(fā)人員都愿把這些代碼提出來(lái),并構(gòu)成一個(gè)新函數(shù)。若這些代碼關(guān)聯(lián)較大并且是完成一個(gè)功能的,那么這種構(gòu)造是合理的,否則這種構(gòu)造將產(chǎn)生隨機(jī)內(nèi)聚的函數(shù)。示例:如下函數(shù)就是一種隨機(jī)內(nèi)聚。

voidInitVar(void)

{

Rect.length=0;

Rect.width=0;/*初始化矩形的長(zhǎng)與寬*/

Point.x=10;

Point.y=10;/*初始化“點(diǎn)”的坐標(biāo)*/

}

矩形的長(zhǎng)、寬與點(diǎn)的坐標(biāo)基本沒(méi)有任何關(guān)系,故以上函數(shù)是隨機(jī)內(nèi)聚。應(yīng)如下分為兩個(gè)函數(shù):

voidInitRect(void)

{

Rect.length=0;

Rect.width=0;/*初始化矩形的長(zhǎng)與寬*/

}

voidInitPoint(void)

{

Point.x=10;

Point.y=10;/*初始化“點(diǎn)”的坐標(biāo)*/

}

13、減少函數(shù)本身或函數(shù)間的遞歸調(diào)用。

說(shuō)明:遞歸調(diào)用特別是函數(shù)間的遞歸調(diào)用(如A->B->C->A),影響程序的可理解性;遞歸調(diào)用一般都占用較多的系統(tǒng)資源(如??臻g);遞歸調(diào)用對(duì)程序的測(cè)試有一定影響。故除非為某些算法或功能的實(shí)現(xiàn)方便,應(yīng)減少?zèng)]必要的遞歸調(diào)用。

14、改進(jìn)模塊中函數(shù)的結(jié)構(gòu),降低函數(shù)間的耦合度,并提高函數(shù)的獨(dú)立性以及代碼可讀性、效率和可維護(hù)性。優(yōu)化函數(shù)結(jié)構(gòu)時(shí),要遵守以下原則:

  1. 能影響模塊功能的實(shí)現(xiàn)。
  2. 仔細(xì)考查模塊或函數(shù)出錯(cuò)處理及模塊的性能要求并進(jìn)行完善。
  3. 通過(guò)分解或合并函數(shù)來(lái)改進(jìn)軟件結(jié)構(gòu)。
  4. 考查函數(shù)的規(guī)模,過(guò)大的要進(jìn)行分解。
  5. 降低函數(shù)間接口的復(fù)雜度。
  6. 不同層次的函數(shù)調(diào)用要有較合理的扇入、扇出。
  7. 函數(shù)功能應(yīng)可預(yù)測(cè)。
  8. 提高函數(shù)內(nèi)聚。(單一功能的函數(shù)內(nèi)聚最高)

說(shuō)明:對(duì)初步劃分后的函數(shù)結(jié)構(gòu)應(yīng)進(jìn)行改進(jìn)、優(yōu)化,使之更為合理。

審核編輯 :李倩


聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • C語(yǔ)言
    +關(guān)注

    關(guān)注

    180

    文章

    7608

    瀏覽量

    137155
  • 代碼
    +關(guān)注

    關(guān)注

    30

    文章

    4803

    瀏覽量

    68754

原文標(biāo)題:寫(xiě)碼如寫(xiě)詩(shī)!嵌入式C代碼規(guī)范有多重要?

文章出處:【微信號(hào):mcu168,微信公眾號(hào):硬件攻城獅】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    利中國(guó)區(qū)總裁董花:利眼中的2025新征程

    網(wǎng)策劃了《2025年半導(dǎo)體產(chǎn)業(yè)展望》專(zhuān)題,收到數(shù)十位國(guó)內(nèi)外半導(dǎo)體創(chuàng)新領(lǐng)袖企業(yè)高管的前瞻觀點(diǎn)。其中,電子發(fā)燒友特別采訪(fǎng)了利中國(guó)區(qū)總裁董花,以下是他對(duì)2025年半導(dǎo)體市場(chǎng)的分析與展望。 ?
    發(fā)表于 12-26 10:58 ?594次閱讀
    <b class='flag-5'>安</b><b class='flag-5'>富</b>利中國(guó)區(qū)總裁董花:<b class='flag-5'>安</b><b class='flag-5'>富</b>利眼中的2025新征程

    利中國(guó)2024年獲多項(xiàng)人力資源管理大獎(jiǎng)

    利中國(guó)在2024年再度展現(xiàn)了其在人力資源管理、職場(chǎng)環(huán)境等方面的卓越實(shí)力,接連榮獲多項(xiàng)大獎(jiǎng)。
    的頭像 發(fā)表于 12-24 17:38 ?431次閱讀

    利榮獲安森美“2024年度智能感知參考設(shè)計(jì)創(chuàng)新獎(jiǎng)”

    近期,利憑借深厚的行業(yè)積淀與卓越的服務(wù)能力榮獲安森美 “2024年度智能感知參考設(shè)計(jì)創(chuàng)新獎(jiǎng) (Intelligent Sensing Reference Design Innovation Award)”。這一殊榮是安森美對(duì)
    的頭像 發(fā)表于 12-16 17:11 ?430次閱讀

    利榮獲2024年度金旗獎(jiǎng)企業(yè)社會(huì)責(zé)任金獎(jiǎng)

    日前,中國(guó)-馬來(lái)西亞國(guó)際品牌大會(huì)暨第15屆金旗獎(jiǎng)品牌大賞盛大舉行,利榮獲2024年度金旗獎(jiǎng)企業(yè)社會(huì)責(zé)任金獎(jiǎng)。此獎(jiǎng)項(xiàng)既是公眾對(duì)利在ESG傳播策略方面的充分認(rèn)可,同時(shí)也是對(duì)公司積極
    的頭像 發(fā)表于 12-09 14:06 ?204次閱讀

    ADS1281 PCM編碼規(guī)范應(yīng)該在哪里找?

    的是,根據(jù)文檔M0是符合PCM編碼的,請(qǐng)問(wèn)這個(gè)PCM編碼規(guī)范應(yīng)該在哪里找?或者它是符合怎么樣的規(guī)范。如何解碼 解碼公式1生成的yn也是符合PCM編碼
    發(fā)表于 12-05 08:33

    利榮獲Nordic年度最佳分銷(xiāo)商獎(jiǎng)

    近日,利中國(guó)團(tuán)隊(duì)?wèi){借在nRF54系列產(chǎn)品推廣中的卓越表現(xiàn),被Nordic授予“年度最佳分銷(xiāo)商獎(jiǎng)”。這一殊榮是對(duì)利專(zhuān)業(yè)能力和市場(chǎng)洞察力的充分肯定,未來(lái)雙方將繼續(xù)深化合作,共同推進(jìn)
    的頭像 發(fā)表于 11-26 11:45 ?355次閱讀

    C語(yǔ)言與Java語(yǔ)言的對(duì)比

    C語(yǔ)言和Java語(yǔ)言都是當(dāng)前編程領(lǐng)域中的重要成員,它們各自具有獨(dú)特的優(yōu)勢(shì)和特點(diǎn),適用于不同的應(yīng)用場(chǎng)景。以下將從語(yǔ)法特性、內(nèi)存管理、跨平臺(tái)性、性能、應(yīng)用領(lǐng)域等多個(gè)方面對(duì)C
    的頭像 發(fā)表于 10-29 17:31 ?376次閱讀

    利與合作伙伴共筑綠色未來(lái)

    在最新的可持續(xù)發(fā)展報(bào)告中,利展示了在環(huán)境保護(hù)方面的努力和成果。我們的碳排放量穩(wěn)步下降,能源使用效率不斷提升,水資源管理更加科學(xué)有效。
    的頭像 發(fā)表于 09-05 11:15 ?483次閱讀
    <b class='flag-5'>安</b><b class='flag-5'>富</b>利與合作伙伴共筑綠色未來(lái)

    利推出新品牌Tria?以整合嵌入式計(jì)算選項(xiàng)

    利宣布推出新品牌Tria ” 利宣布推出新品牌Tria和名為T(mén)ria Technologies的相應(yīng)業(yè)務(wù),以整合其計(jì)算設(shè)計(jì)和制造業(yè)務(wù)板塊。Tria將成為整合
    的頭像 發(fā)表于 09-03 18:45 ?592次閱讀

    C語(yǔ)言編碼規(guī)范,這才是最理想的!

    編碼規(guī)范,沒(méi)有最好,只有最合適,有但不執(zhí)行不如沒(méi)有。一、編碼原則01可讀性清晰第一清晰性是易于維護(hù)程序必須具備的特征。維護(hù)期變更代碼的成本遠(yuǎn)遠(yuǎn)大于開(kāi)發(fā)期,編寫(xiě)程序應(yīng)該以人為本,計(jì)算機(jī)第二。一般情況下
    的頭像 發(fā)表于 07-06 08:11 ?915次閱讀
    <b class='flag-5'>C</b><b class='flag-5'>語(yǔ)言</b><b class='flag-5'>編碼</b><b class='flag-5'>規(guī)范</b>,這才是最理想的!

    PLC編程語(yǔ)言C語(yǔ)言的區(qū)別

    在工業(yè)自動(dòng)化和計(jì)算機(jī)編程領(lǐng)域中,PLC(可編程邏輯控制器)編程語(yǔ)言C語(yǔ)言各自扮演著重要的角色。盡管兩者都是編程語(yǔ)言,但它們?cè)诙鄠€(gè)方面存在顯著的區(qū)別。本文將從多個(gè)維度深入探討PLC編程
    的頭像 發(fā)表于 06-14 17:11 ?3002次閱讀

    利 RZBoard V2L 電路板數(shù)據(jù)手冊(cè)

    電子發(fā)燒友網(wǎng)站提供《利 RZBoard V2L 電路板數(shù)據(jù)手冊(cè).rar》資料免費(fèi)下載
    發(fā)表于 05-14 16:58 ?0次下載
    <b class='flag-5'>安</b><b class='flag-5'>富</b>利 RZBoard V2L 電路板數(shù)據(jù)手冊(cè)

    H3LIS200DL無(wú)法讀取是為什么?

    X軸數(shù)據(jù),都一直是0,想問(wèn)下是Pn10的原因嗎?或者ST官方有沒(méi)有參考的例程啊? 后來(lái)程序改用的例程,發(fā)現(xiàn)可以讀取,開(kāi)始以為是正點(diǎn)原子的程序不好導(dǎo)致,繼續(xù)排查,原子的是讀取單個(gè)字節(jié),
    發(fā)表于 03-20 06:55

    c語(yǔ)言,c++,java,python區(qū)別

    C語(yǔ)言、C++、Java和Python是四種常見(jiàn)的編程語(yǔ)言,各有優(yōu)點(diǎn)和特點(diǎn)。 C語(yǔ)言
    的頭像 發(fā)表于 02-05 14:11 ?2463次閱讀

    vb語(yǔ)言c++語(yǔ)言的區(qū)別

    VB語(yǔ)言C++語(yǔ)言是兩種不同的編程語(yǔ)言,雖然它們都屬于高級(jí)編程語(yǔ)言,但在設(shè)計(jì)和用途上有很多區(qū)別。下面將詳細(xì)比較VB
    的頭像 發(fā)表于 02-01 10:20 ?2391次閱讀
    主站蜘蛛池模板: 精油按摩日本| 国产成人久久精品AV| 黄色大片aa| 午夜免费福利| 干性感美女| 日本一二三区在线视频| www.av色| 青青操久久| 成年人视频免费在线观看| 欧美特黄99久久毛片免费| CHINA篮球体育飞机2022网站| 男女肉大捧进出全过程免费| 97SE亚洲国产综合自在线不卡 | 国产午夜精品福利久久| 午夜亚洲WWW湿好大| 国产人人为我我为人人澡| 亚州免费一级毛片| 国产在线伊人| 亚洲欧美日韩一级特黄在线| 精品极品三大极久久久久| 亚洲日本国产综合高清| 久艾草在线精品视频在线观看| 亚洲欧美综合乱码精品成人网| 精品国产自在自线官方| 在线播放免费人成毛片视频| 老阿姨儿子一二三区| 97超碰在线视频人人av| 欧美高跟镣铐bdsm视频| www.青青草.com| 色狠狠色狠狠综合天天| 国产剧情福利AV一区二区| 亚洲精品不卡在线| 久久99国产综合精品AV蜜桃| 《乳色吐息》无删减版在线观看 | 精品国产乱码久久久久久口爆| 亚洲免费在线视频观看| 久久精品中文字幕有码日本| 91精品婷婷国产综合久久8| 男人插曲女人的视频| 成人五级毛片免费播放| 污污内射在线观看一区二区少妇|