最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會員登陸 & 注冊

如何寫出好的代碼(一) - 編程規(guī)范

2020-10-12 21:52 作者:奧大梨呀  | 我要投稿

????怎么寫出好的代碼,這涉及到很多方面。本文主要以編程規(guī)范和程序可移植性這兩方面來說明。因為篇幅的原因,此次先介紹編程規(guī)范方面。

????相信很多朋友和筆者一樣,在剛?cè)腴T編程不久時,寫的代碼都是非常難看和移植的,盡管它可以運行。然而當(dāng)你現(xiàn)在去看過去自己寫的代碼時,是不是覺得想一巴掌送給當(dāng)時的自己:“你這寫的是啥玩意?”。如果你沒有這樣的想法的話,說明朋友你在程序結(jié)構(gòu)這方面不是很重視,又或者是相對來說進步不大。下面分享一些我學(xué)習(xí)到的經(jīng)驗,因我是做嵌入式開發(fā)常用C語言,因此就以C語言進行說明。

????那么首先我們先說說編程規(guī)范,這一點已經(jīng)逐漸成為了程序員們的共識,網(wǎng)絡(luò)上可以找到許多規(guī)范要求。這里我總結(jié)一些比較重要的。

????1.標(biāo)識符的命名。命名需要讓人“一看就知道什么作用”。比如一個接收緩沖區(qū)指針:rxbuff。函數(shù)宏定義等也是這樣的要求。當(dāng)然,不同的平臺對標(biāo)識符的命令略有差異,在linux提倡以下劃線隔開單詞的變量命名方式。而在QT5中,則是提倡第一個單詞小寫,第二個單詞首字母大寫的變量命名方式,如下圖所示。

不同平臺的標(biāo)識符命名

????2.每個模塊或者功能都分別使用一個C源文件和H頭文件,不要全都擠在一個文件中。

頭文件一般放函數(shù)聲明,類型聲明(如struct)和宏定義。而源文件則是變量和函數(shù)的定義。

????3.利用好關(guān)鍵字static,將不需要對外開發(fā)的函數(shù)變量等限定作用域在某個文件中。全局變量一般都定義為static類型,其他文件需要操作時,使用一個函數(shù)對外提供接口。這點在后面程序可移植性時會再提到。

????4.對于雙目運算符來說,其兩邊各加上一個空格,而單目運算符則不需要,對于逗號是在其后方加上一個空格。在不同作用的代碼段之間空行,不至于讓代碼都擠在一起。

加空格與空行

5.在定義變量時對變量進行初始化,尤其是指針,一般初始化為NULL,避免“野指針”的出現(xiàn)。

變量初始化

6.要在適當(dāng)?shù)牡胤绞褂肨AB或空格縮進,一定要統(tǒng)一,要么都使用空格,要么都使用TAB,因為不同的開發(fā)環(huán)境,對于TAB定義的長度都是不同的,如果空格和TAB混用,那么在其他開發(fā)環(huán)境打開時,可能就亂糟糟的了。還有大括號最好在成對出現(xiàn)在同一列,像這樣

縮進與對齊1

當(dāng)然有些地方也提倡這樣的寫法:

縮進與對齊2

這種把第一個大括號緊跟在后的寫法我個人其實不是很喜歡,每兩個大括號的配對看起來不是很清晰。因此我更多的是采用第一種寫法,當(dāng)然這要看每個人的喜好了,不論是哪一種,只要不是像下面這樣亂糟糟的就行了:

錯誤范例

這要是代碼量一大,鬼知道哪個括號配哪個。

????7.學(xué)會合理地寫注釋。這一點非常重要,大家都調(diào)侃說“程序員討厭沒有注釋的代碼,也討厭寫注釋”。前半句我認(rèn)為很合理,而后半句應(yīng)該是這樣“討厭寫不必要的注釋”。寫注釋的目的大多是為了方便自己以后能快速讀懂自己寫的代碼,僅有少部分是讓后來的人看的。不必要寫的注釋意思是有些語句一看就懂沒必要寫注釋,比如:GPIOB->BSRR = 1 << 5;我相信學(xué)過STM32的肯定看一眼就知道這是什么意思。相對而言,對某些變量的作用,其位操作,計算等,這些就比較需要注釋了。否則后面再看的時候,我想一時半會應(yīng)該是不明白自己當(dāng)時寫這些是什么意思吧。拿我之前寫的DMA數(shù)碼管驅(qū)動來說吧,下圖:

驅(qū)動 - 初始化顯存

這段代碼大概是4個月前寫的,現(xiàn)在打開,憑著這段注釋,我還能在30秒內(nèi)理清我當(dāng)時所想的思路。但要是拿掉注釋,估計得花不少時間來解讀這段代碼了。

????8.多行的宏定義使用do-while(0)進行封裝,而不是使用大括號{}。見下圖(圖中的 ’\’?是用來續(xù)下一行的,且whle(0)后不加分號):

多行宏定義封裝

使用do-while(0)的好處是符合函數(shù)調(diào)用后加上分號的習(xí)慣,也能避免一些錯誤。詳情見下圖:

宏定義調(diào)用

這種情況下,如果宏定義使用do-while(0)的形式不會出現(xiàn)任何問題,但如果采用大括號{}的形式,代碼在預(yù)編譯階段時會被替換成這樣:

宏定義替換

很明顯問題就出來了,下面的else因為被一個分號隔開,無法與if配對,編譯報錯。若去掉分號,又不符合書寫習(xí)慣,想想一個像函數(shù)調(diào)用的語句后面沒有分號,看起來是不是很奇怪?

????9.正確書寫main函數(shù)的格式。main函數(shù)的寫法網(wǎng)絡(luò)上大概有下面這么幾種:

main函數(shù)寫法

目前而言,標(biāo)準(zhǔn)的寫法只有標(biāo)注釋的這3種,前面3種不標(biāo)準(zhǔn),盡管有些地方不需要寫標(biāo)準(zhǔn)的main函數(shù),比如單片機裸機編程,但為了嚴(yán)格和習(xí)慣,還是按照標(biāo)準(zhǔn)來寫比較好。

標(biāo)準(zhǔn)寫法1適用于不需要向程序傳遞參數(shù)的情況。而寫法2和3是等價的,argc表示參數(shù)的個數(shù),argv表示參數(shù)陣列。

而對于最后一種,多了一個參數(shù)envp,是程序內(nèi)部用來獲取系統(tǒng)變量的,但通常都使用getenv()函數(shù)來代替之獲取系統(tǒng)變量,因此不使用這種格式。

????以上就是我目前能想到的一些比較重要的編程規(guī)范了。如果有什么遺漏或者錯誤,還請批評指正。

????另外,Up平常主要是利用課余時間做各種單片機項目練習(xí),兼學(xué)習(xí)Linux知識。后面可能會做一些項目的視頻,最近應(yīng)該是隨緣更新專欄了吧。這在里也感謝各位朋友的關(guān)注。


如何寫出好的代碼(一) - 編程規(guī)范的評論 (共 條)

分享到微博請遵守國家法律
新竹县| 姚安县| 额尔古纳市| 安化县| 霸州市| 涡阳县| 青冈县| 三门县| 大冶市| 韶山市| 邵阳市| 内乡县| 高密市| 靖安县| 乾安县| 岫岩| 德钦县| 简阳市| 武鸣县| 华容县| 偃师市| 开化县| 长白| 临清市| 鸡东县| 福海县| 嘉禾县| 宁国市| 靖州| 民县| 晋中市| 汝城县| 水城县| 永安市| 秦安县| 开封县| 香河县| 长沙市| 和林格尔县| 巴青县| 洛扎县|